標籤:os for io type amp res
知道降冪公式這題就很好辦了 B>=Phi(c)的時候可以降冪然後快速冪計算,否則就直接快速冪計算。
這裡的大數對小數模數直接利用模數性質按位取就行了。
//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;}