题意:
给A,B,令s时A^B的所有约数和,计算s % 9901.
解析:
A = p1^k1 * p2^k2 * p3^k3 * ... * pm^km .
所以,A^B = p1^Bk1 * p2^Bk2 * p3^Bk3 * ... * pm^Bkm .
由乘性函数的性质,所有因子和:
S = (1 + p1 + p1^2 + p1^3 + p1^4 + ... + p1^Bk1) * (1 + p2 + p2^2 + p2^3 + p2^4 + ... + p2^Bk2)......
等比数列求和用二分来求.
含1+:
LL sum_mod(LL a, LL n)
{
if (n == 0)
return 1;
LL t = (n >> 1);
if (n & 1)
{
return ( (1 + pow_mod(a, t + 1)) * sum_mod(a, t) ) % mod;
}
else
{
return ( (1 + pow_mod(a, t + 1)) * sum_mod(a, t - 1) + pow_mod(a, t) ) % mod;
}
}
不含1+:
LL sum_mod(LL a, LL n)
{
if (n == 0)
return 1;
if (n & 1)
{
LL t = (n - 1) >> 1;
return ( (1 + pow_mod(a, t + 1)) * sum_mod(a, t) + pow_mod(a, t + 1) ) % mod;
}
else
{
LL t = n >> 1;
return ( (1 + pow_mod(a, t)) * sum_mod(a, t) ) % mod;
}
}
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
using namespace std;
const int mod = 9901;
LL pow_mod(LL a, LL n)
{
if (n == 0)
return 1;
LL x = pow_mod(a, n >> 1);
LL res = x * x % mod;
if (n % 2)
res = res * a % mod;
return res;
}
LL sum_mod(LL a, LL n)
{
if (n == 0)
return 1;
LL t = (n >> 1);
if (n & 1)
{
return ( (1 + pow_mod(a, t + 1)) * sum_mod(a, t) ) % mod;
}
else
{
return ( (1 + pow_mod(a, t + 1)) * sum_mod(a, t - 1) + pow_mod(a, t) ) % mod;
}
}
LL solve(LL a, LL k)
{
LL res = 1;
for (LL i = 2; i * i <= a; i++)
{
LL cnt = 0;
while (a % i == 0)
{
a /= i;
cnt++;
}
res = (res * sum_mod(i, cnt * k)) % mod;
}
if (a != 1)
res = (res * sum_mod(a, k)) % mod;
return res;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
LL a, k;
while (~scanf("%lld%lld", &a, &k))
{
printf("%lld\n", solve(a, k));
}
return 0;
}