更高效率的A^B mod C

#include<iostream> #include<string.h> using namespace std; __int64 a,b,c; char s[1000005]; __int64 eular(__int64 n) { __int64 ans=1,i; for(i=2;i*i<=n;i++) { if(n%i==0) { n/=i; ans*=i-1; while(n%i==0) { n/=i; ans*=i; } } } if(n>1) ans*=n-1; return ans; } int cmp(__int64 x) { __int64 sum=0; int len=strlen(s); for(int i=0;i<len;i++) { sum=sum*10+s[i]-'0'; if(sum>x) return 1; } return 0; } __int64 strmod(__int64 t) { __int64 sum=0; int i,len=strlen(s); for(i=0;i<len;i++) { sum=sum*10+s[i]-'0'; while(sum>=t) sum-=t; } return sum; } __int64 getsum() { __int64 sum=0; int i,len=strlen(s); for(i=0;i<len;i++) sum=sum*10+s[i]-'0'; return sum; } __int64 mod_exp() { __int64 res=1; while(b) { if(b&1) res=(res%c)*(a%c)%c; b>>=1; a=(a%c)*(a%c)%c; } return res; } int main() { while(scanf("%I64d%s%I64d",&a,s,&c)==3) { __int64 ans,t; t=eular(c); if(cmp(t)) { b=strmod(t)+t; } else b=getsum(); printf("%I64d/n",mod_exp()); } return 0; }

你可能感兴趣的:(更高效率的A^B mod C)