輸入a,b,求a^b的全部因子之和

 題目 poj的1845
 數組

分解a的質因數a=p1^t1*p2^t1........ide

每一個質因數對sum的貢獻: 當除去質因數p1時的因數和爲sum,當計入p1時,因子和變成sum*p1^0+sum*p1^1+sum*p1^2......+sum*p1^t1函數

也就是全部的sum=【1+p1+p1^2+p1^3+...+p1^t1】*【p2.....】【p3...】spa

而後因爲是a^b,因此最後是code

sum=sum=【1+p1+p1^2+p1^3+...+p1^(t1*b)】*【p2.....】【p3...】blog

顯然就是求關於a的全部質因數的一個 等比數列之和前n項和.ci

用逆元,用公比求和公式  1+pi+...+pi^n=(pi^(n+1)-1)/(pi-1)
  因爲涉及到除法,且mod=9901爲素數,因此能夠用費馬小定理求逆元,只是要注意mod比較小,
當【prim[i]-1】%mod==0(分母是mod的倍數)時,逆元不存在,不過此時剛好公比爲1啦,前n項和答案就是n
代碼以下 :
 1 int pime[103];
 2 int s[103];
 3 int cnt=0;
 4 void init(ll n)//這個函數很巧妙 能夠不打表找素數
 5 {
 6     for(ll i=2;i*i<=n;i++)
 7     {
 8         if(n%i==0)//若是n能被i正除,i就是素數,本身好好想想,爲何
 9         {
10             pime[++cnt]=i;//是素數用數組記錄下來
11             while(n%i==0)//而後找該素數有幾個
12             {
13                 n/=i;
14                 s[cnt]++;//符合條件的第cnt個素數累加
15             }
16         }
17     }//循環繼續查找
18     if(n>1)pime[++cnt]=n,s[cnt]++;//n==1說明已經除盡了,反之沒有由於剛開始的是算sqrt(n)之內的素數。
19 }
20 ll ks(ll a,ll b)//快速冪
21 { ll z=1;
22     while(b)
23     {
24         if(b&1)z=(z*a)%mod;
25         a=(a*a)%mod;
26         b>>=1;
27     }
28     return z;
29 }
30 int main()
31 {
32  ll a,b;
33    cin>>a>>b;
34    //if(a<=1||b==0)
35   // {
36   //     cout<<1;return 0;
37   // }//可要可不要
38    init(a);
39    ll sum=1;
40    for(int i=1;i<=cnt;i++)
41    {
42        if((pime[i]-1)%mod==0) sum=sum*(s[i]*b+1)%mod;
43        else sum=(sum*(ks(pime[i],s[i]*b+1)-1)*ks(pime[i]-1,mod-2))%mod;//用等比數列求和公式
44    }cout<<(sum+mod)%mod;
45 }
View Code
相關文章
相關標籤/搜索