题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2837
额,这两天做上了数论,搞了一个上午终于AC了,不过还是看了别人的代码。。
就是利用一个公式A^B %C = A^( B%phi[C] + phi[C]) %C (B>=phi[C])
大致思路还算清晰,就是要注意中间的细节。
回头再看看吧~~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }