题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2837

额,这两天做上了数论,搞了一个上午终于AC了,不过还是看了别人的代码。。

就是利用一个公式A^B %C  = A^( B%phi[C]  + phi[C]) %C    (B>=phi[C])

大致思路还算清晰,就是要注意中间的细节。

回头再看看吧~~

View Code
 1 # include<stdio.h>
 2 # include<string.h>
 3 # include<stdlib.h>
 4 __int64 eular(__int64 num)
 5 {
 6     __int64 ret=1;
 7     for(int i=2;i*i<=num;i++)
 8     {
 9         if(num%i==0)
10         {
11             num/=i;ret*=i-1;
12             while(num%i==0) {num/=i;ret*=i;}
13         }
14     }
15     return num>1? ret*(num-1):ret;
16 }
17 __int64 mod(__int64 A,__int64 B,__int64 C) //A^B%C
18 {
19     __int64 ans,res=1;
20     int i;
21     ans=1;
22     for(i=1;i<=B && res<=C;i++) res=res*A; 
23     while(B)
24     {
25         if(B%2) ans=ans*A%C;
26         A=A*A%C;
27         B/=2;
28     }
29     if(res>=C) return ans+C;
30     return ans;
31 }
32 
33 ///// A^B %C = A^( B % Phi[C] + Phi[C]) % C       (B >= Phi[C])
34 __int64 dfs(__int64 n,__int64 m) //f[n]%m
35 {
36     __int64 ans;
37     ans=eular(m);
38     if(n==0) return 1%m;
39     return mod(n%10,dfs(n/10,eular(m)),m);
40 }
41 
42 int main()
43 {
44     int ncase;
45     __int64 num,n,m;
46     scanf("%d",&ncase);
47     while(ncase--)
48     {
49         scanf("%I64d%I64d",&n,&m);
50         num=dfs(n,m);
51         printf("%I64d\n",num%m);
52     }
53     return 0;
54 }

 

 

posted on 2012-05-11 13:17  奋斗青春  阅读(358)  评论(0编辑  收藏  举报