poj1845 sumdiv (因数的和)

首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$

然后的话,它的所有因数的和就是$\prod{(1+p_i^1+p_i^2+...+p_i^n)}$

用一个等比数列求和公式,变成了$\prod{\frac{p_i^{m_iB+1}-1}{p_i-1}}$

但是要求逆元的话,它的模数很小,可能求不了

所以在算$p_i^{n+1}-1$的时候先模的是$mod*(p_i-1)$,然后直接除以$p_i-1$,一定能整除

最后再模一边mod就行了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define pa pair<int,int>
 5 #define CLR(a,x) memset(a,x,sizeof(a))
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e4,P=9901;
 9 
10 inline ll rd(){
11     ll x=0;char c=getchar();int neg=1;
12     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
13     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
14     return x*neg;
15 }
16 
17 ll p[maxn];
18 ll n[maxn],a,b;
19 
20 inline ll fmul(ll x,ll y,ll p){
21     ll re=0;
22     while(y){
23         if(y&1) re=(re+x)%p;
24         x=(x+x)%p,y>>=1; 
25     }return re;
26 }
27 
28 inline ll fpow(ll x,ll m,ll p){
29     ll re=1;
30     while(m){
31         if(m&1) re=fmul(re,x,p);
32         x=fmul(x,x,p),m>>=1; 
33     }return re;
34 }
35 
36 int main(){
37     int i,j=0,k;
38     a=rd(),b=rd();
39     for(i=2;i*i<=a;i++){
40         if(a%i==0) p[++j]=i;
41         while(a%i==0) n[j]++,a/=i;
42     }if(a!=1) p[++j]=a,n[j]=1;
43     ll ans=1;
44     for(i=1;i<=j;i++){
45         ll x=fpow(p[i],n[i]*b+1,(p[i]-1)*P)+(p[i]-1)*P-1;
46         ans=ans*(x/(p[i]-1)%P)%P;
47     }
48     printf("%d\n",(ans+P)%P);
49     return 0;
50 }

 

posted @ 2018-11-27 19:37  Ressed  阅读(156)  评论(0编辑  收藏  举报