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
对于A^B%C 有一个公式 即
A^x = A^(x % Phi(C) + Phi(C)) (mod C)
公式的具体证明:http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9
// A^x = A^(x % Phi(C) + Phi(C)) (mod C),其中x≥Phi(C) #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; char bb[1000001]; LL a,m; LL phi(LL n) { LL rea=n; for(int i=2;i*i<=n;i++){ if(n%i==0){ rea=rea-rea/i; while(n%i==0) n/=i; } } if(n>1) rea=rea-rea/n; return rea; } LL quick_mod(LL a,LL b,LL m) { LL ans=1; a%=m; while(b){ if(b&1){ ans=ans*a%m; b--; } b>>=1; a=a*a%m; } return ans; } int main() { while(~scanf("%lld",&a)){ scanf("%s",bb); scanf("%lld",&m); LL t=phi(m); int l=strlen(bb); LL b=0; for(int i=0;i<l;i++){ b=b*10+bb[i]-'0'; while(b>=t) b-=t; } b+=t; printf("%lld\n",quick_mod(a,b,m)); } return 0; }