poj1845sumdiv

poj1845 sumdiv

题意

求$A^B$的所有约束之和mod9901.

思路

​ A可以写成

​ 然后

而等比数列的公式可以写成

这样问题就得以解决。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
using namespace std;
const int mod=9901;
int a,b;
int p[20],c[20];
int m=0;
void divide(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0){
p[++m]=i;
c[m]=0;
while(x%i==0) x/=i,c[m]++;
}
}
if(x>1) p[++m]=x,c[m]=1;
}
long long ksm(long long a,long long b) {
int c = 1;
while(b){
if(b&1) c=c*a%mod;
a=a*a%mod;
b>>=1;
}
return c;
}
int main(){
cin>>a>>b;
long long ans=1;
divide(a);
for(int i=1;i<=m;i++){
if((p[i]-1)%mod==0){
ans=(b*c[i]+1)%mod*ans%mod;
}
else{
long long x=(ksm(p[i],b*c[i]+1)-1+mod)%mod;
x*=ksm(p[i]-1,mod-2)%mod;
ans=ans*x%mod;
}
}
cout<<ans<<endl;
}