首先对于,可以通过质因数分解,求出所有的质因数次数。
对于质因数
,次数为
,由于
次方,那么变为
。
约数和可以这样表示:
对于单独的。需要求解这个等差数列的和。由于给出的模数为质数,根据等比数列求和公式
。分子下面可以用逆元求得。
还有一种精妙的分治法也可以求得,题解区有就不多赘述,代码中也有体现。
//快速幂
int pow(int x,int n,int m){
int res = 1;
while(n){
if(n & 1) res = res * x % m;
x = x * x % m;
n >>= 1;
}
return res;
}
//分治法求等比数列和
int f(int p,int n){
if(n == 0) return 1;
if(n == 1) return (p + 1) % MOD;
int res = 0;
if(n % 2 == 0){
res += pow(p,n,MOD);
res %= MOD;
n--;
}
int t = (1 + pow(p,n / 2 + 1,MOD)) * f(p,n / 2) % MOD;
res += t;
res %= MOD;
return res;
}
//逆元求
int f2(int p,int n){
int inv = pow(1 - p,MOD - 2,MOD);
return (inv * (1 - pow(p,n + 1,MOD) + MOD)) % MOD;
}
void solve(){
int a,b; cin >> a >> b;
if(a == 1 || a == 0){
cout << "0" << endl;
return;
}
unordered_map<int,int> mp;
int x = 2;
while(x * x <= a){
while(a % x == 0){
mp[x]++;
a /= x;
}
x++;
}
if(a > 1) mp[a]++;
int res = 1;
for(auto [p,v]: mp){
int n = v * b;
res = (res * f2(p,n)) % MOD;
}
cout << (res + MOD) % MOD << endl;
}