poj 1845 Sumdiv

 1 /**
 2 大意: 计算 a^b  的所有因子的和, 和mod 9901
 3 思路; 将a 进行质因子分解,那么所有因子的和为
 4 (2^0+ 2^1 + 2^2 +....+ 2^a1)*(3^0 + 3^1+..+ 3^a2)*.....
 5 注意: 求模n下a的逆,需要 gcd(a,n) =1,,所以此处不适合
 6 用二分求  0-n 次幂的和。。。 又遇到了一次。。。
 7 注意中间过程的取模。,,,不然会溢出。。
 8 **/
 9 
10 #include <iostream>
11 #include <cmath>
12 #include <algorithm>
13 #include <cstring>
14 using namespace std;
15 long long ddiv[50000];
16 long long res[50000];
17 int cnt;
18 const int mod = 9901;
19 void get_dr(long long n){
20     memset(res,0,sizeof(res));
21     long long m = (long long )sqrt(n+0.5);
22     cnt =0;
23     for(int i=2;i<=m;i++)if(n%i==0){
24         ddiv[cnt] = i;
25         while(n%i==0){
26             res[cnt]++;
27             n = n/i;
28         }
29         cnt++;
30     }
31     if(n>1){
32         ddiv[cnt] = n;
33         res[cnt]++;
34         cnt++;
35     }
36 }
37 
38 long long  pow_mod(long long  a,long long  n){
39     if(n==0)
40         return 1;
41     long long  c =1;
42     a =a %mod;
43     while(n){
44         if(n&1)
45             c =c*a%mod;
46         a =a*a%mod;
47         n>>=1;
48     }
49     return c;
50 }
51 
52 long long sum (long long p,long long n){
53         if(n==0)
54             return 1; 
55         if(n%2){     // 因为是从0开始的。。所以此处才是偶数的情况
56             return (sum(p,n/2)*(1+pow_mod(p,n/2+1)))%mod;
57         }
58         else     // 奇数的情况
59             return (sum(p,n/2-1)*(1+pow_mod(p,n/2+1))+pow_mod(p,n/2))%mod;
60 }
61 
62 int main()
63 {
64     long long a,b;
65     while(cin>>a>>b){
66         if(b==0){
67             cout<<1<<endl;
68         }else if(a==0){
69             cout<<0<<endl;
70         }else{
71             get_dr(a);
72             //for(int i=0;i<cnt;i++)
73             //    cout<<ddiv[i]<<endl;
74             for(int i=0;i<cnt;i++){
75                 res[i] *= b;
76             }
77             //for(int i=0;i<cnt;i++)
78             //   cout<<res[i]<<endl;
79             long long ans =1;
80             for(int i=0;i<cnt;i++){
81                 ans = (ans*(sum(ddiv[i],res[i]))%mod)%mod;
82                 ans  =ans%mod;
83             }
84             ans = ans%mod;
85             cout<<ans<<endl;
86         }
87     }
88     return 0;
89 }

 

posted @ 2014-05-12 20:20  夜晓楼  阅读(180)  评论(0编辑  收藏  举报