本文共 1930 字,大约阅读时间需要 6 分钟。
要解决这个问题,我们需要计算两个自然数A和B的幂的所有自然数因子的和S,并对S取模9901。由于直接计算A^B可能会非常大,我们需要使用数学公式来高效计算。
#include#include #include typedef long long ll;ll multi(ll a, ll b, ll m) { ll ans = 0; a %= m; while (b) { if (b & 1) { ans = (ans + a) % m; b--; } b >>= 1; a = (a + a) % m; } return ans;}ll quick_mod(ll a, ll b, ll mod) { ll res = 1; while (b) { if (b % 2 == 1) { res = multi(res, a, mod); } b >>= 1; a = multi(a, a, mod); } return res;}int main() { ll a, b; scanf("%I64d %I64d", &a, &b); if (a == 1) { printf("1\n"); return 0; } ll mod = 9901; ll result = 1; // 质因数分解函数 for (ll p = 2; p * p <= a; p += 2) { if (a % p == 0) { ll exponent = 0; while (a % p == 0) { exponent++; a /= p; } ll m = mod * (p - 1); ll numerator = quick_mod(p, exponent * b + 1, m); ll sum_p = (numerator + m - 1) / (p - 1) % mod; result = (result * sum_p) % mod; } } if (a > 1) { ll m = mod * (a - 1); ll exponent_plus_1 = b + 1; ll numerator = quick_mod(a, exponent_plus_1, m); ll sum_a = (numerator + m - 1) / (a - 1) % mod; result = (result * sum_a) % mod; } printf("%I64d\n", result); return 0;}
quick_mod函数使用二分法计算大数的幂,并在每一步进行模运算,避免数值溢出。通过这种方法,我们能够高效地计算大数的因数和,并对其取模,解决了问题中的计算难题。
转载地址:http://edkzz.baihongyu.com/