【正经题解】填数游戏
2024-03-15 17:43:29
发布于:浙江
6阅读
0回复
0点赞
使用了快速幂算法 ( ) 来计算指数,以避免直接计算大数次方时的性能问题。根据输入的 和 的不同取值,选择不 同的计算方式,并输出答案。注意输出答案时都取模 。
#include <cstdio>
#define mod 1000000007
typedef long long LL;
// 快速幂算法
inline LL ksm(LL a, LL b) {
LL r = 1;
for (; b; a = a * a % mod, b >>= 1)
if (b & 1) r = r * a % mod;
return r;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
// 确保 n <= m
if (n > m) n ^= m ^= n ^= m;
if (n == 1)
// 如果 n 为 1,答案是 2 的 m 次方
printf("%lld", ksm(2, m));
else if (n == 2)
// 如果 n 为 2,答案是 4 乘以 3 的 m-1 次方
printf("%lld", 4 * ksm(3, m - 1) % mod);
else if (n == 3)
// 如果 n 为 3,答案是 112 乘以 3 的 m-3 次方
printf("%lld", 112 * ksm(3, m - 3) % mod);
else {
if (m == n)
// 如果 n 和 m 相等,答案是 (83 乘以 8 的 n 次方 + 5 乘以 2 的 n+7 次方) 模 190104168
printf("%lld", (83 * ksm(8, n) % mod + 5 * ksm(2, n + 7) % mod) * 190104168 % mod);
else
// 否则,答案是 (83 乘以 8 的 n 次方 + 2 的 n+8 次方) 模 3 的 m-n-1 次方 乘以 570312504 模 1000000007
printf("%lld", (83 * ksm(8, n) % mod + ksm(2, n + 8)) * ksm(3, m - n - 1) % mod * 570312504 % mod);
}
return 0;
}
这里空空如也
有帮助,赞一个