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
处理大数的方法挺经典的,把别人代码贴出来以示膜拜
view code//A^B %C=A^( B%phi(C)+phi(C) ) %C #include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include<string> #include<cmath> using namespace std; typedef __int64 ll; int phi(int x) { int i,j; int num = x; for(i = 2; i*i <= x; i++) { if(x % i == 0) { num = (num/i)*(i-1); while(x % i == 0) { x = x / i; } } } if(x != 1) num = (num/x)*(x-1); return num; } ll quickpow(ll m,ll n,ll k) { ll ans=1; while(n) { if(n&1) ans=(ans*m)%k; n=(n>>1); m=(m*m)%k; } return ans; } char tb[1000015]; int main() { ll a,nb; int c; while(scanf("%I64d%s%d",&a,tb,&c)!=EOF) { int PHI=phi(c); ll res=0; for(int i=0;tb[i];i++) { res=(res*10+tb[i]-'0'); if(res>c)break; } if(res<=PHI) { printf("%I64d\n",quickpow(a,res,c)); } else { res=0; for(int i=0;tb[i];i++) { res=(res*10+tb[i]-'0')%PHI; } printf("%I64d\n",quickpow(a,res+PHI,c)); } } return 0; }