Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
3 2 4 2 10 1000
124
有公式A^B%C=A^(B%PHI(C)+PHI(C))%C;
这道题先求出C的欧拉函数,然后再用快速幂即可;
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define ll long long using namespace std; ll A,B,C; ll geteular(ll n) { ll i, res=n; ll t= (ll)sqrt(n) + 1; for (i = 2; i <t; i++) if(n%i==0) { res = res / i * (i - 1); while (n % i == 0) n /= i; } if (n > 1) res = res / n * (n - 1); return res; } ll pow(ll a,ll b) { ll res=1; while(b>0) { if(b&1) res=res*a%C; a=a*a%C; b>>=1; } return res; } int main() { char B[1000010]; while(scanf("%lld%s%lld",&A,&B,&C)!=EOF) { ll x=0; ll cc=geteular(C); //cout<<cc<<endl; int len=strlen(B); for(int i=0; i<len; i++) { x=x*10+(B[i]-'0'); x%=cc; } x+=cc; printf("%lld\n",pow(A,x)); } return 0; }