fzou 1759 Super A^B mod C
Problem 1759 Super A^B mod CAccept: 456 Submit: 1488
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
Input
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
Output
For each testcase, output an integer, denotes the result of A^B mod C.
Sample Input
3 2 4
2 10 1000
Sample Output
1
24
1 /* 2 高次同余第一题: 3 4 大牛提起过这道题,当时觉得b太大了10^1000000,无从下手。 5 a^b%c=a^(b%phi(c))%c ,注意a==c的情况 6 这句话,想起了 费马小定理 a^b%c=a^(b%(c-1))%c; c是互数,a,c互质的时候。 7 费马小定理是一个特殊的总结吧。这个是通式。 8 */ 9 10 #include<iostream> 11 #include<cstdio> 12 #include<cstdlib> 13 #include<cstring> 14 using namespace std; 15 16 char b[1000005]; 17 18 __int64 Euler(__int64 n) 19 { 20 __int64 i,temp=n; 21 for(i=2;i*i<=n;i++) 22 { 23 if(n%i==0) 24 { 25 while(n%i==0) 26 n=n/i; 27 temp=temp/i*(i-1); 28 } 29 } 30 if(n!=1) temp=temp/n*(n-1); 31 return temp; 32 } 33 34 __int64 power_sum2(__int64 a,__int64 n,__int64 mod) 35 { 36 __int64 ans=1; 37 while(n) 38 { 39 if(n&1) 40 { 41 ans=(ans*a)%mod; 42 } 43 n=n>>1; 44 a=(a*a)%mod; 45 } 46 return ans; 47 } 48 49 int main() 50 { 51 __int64 a,c,len,k,cur,i; 52 while(scanf("%I64d",&a)>0) 53 { 54 scanf("%s",b+1); 55 scanf("%I64d",&c); 56 if(a==c) 57 { 58 printf("0\n"); 59 continue; 60 } 61 len=strlen(b+1); 62 k=Euler(c); 63 for(i=1,cur=0;i<=len;i++) 64 { 65 cur=cur*10+b[i]-'0'; 66 cur=cur%k; 67 } 68 printf("%I64d\n",power_sum2(a%c,cur,c)); 69 } 70 return 0; 71 }