E - Super A^B mod C
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%mod c,但是因为B实在是太大了,所以要实行降幂处理,其实有这么一个公式可以解决:
代码如下
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 ll;
const ll N=1001000;
ll p[N];
char s[N];
ll A,B,C;
ll mypow(ll m,ll n ){//快速幂
ll ans=1;
ll b=m;
while(n){
if(n&1)
ans=(ans*b)%C;
b=b*b%C;
n/=2;
}
return ans;
}
void prime(){//素数打表
memset(p,0,sizeof(p));
p[1]=1;
for(ll i=2;i<=sqrt(N);i++){
for(ll j=2;j<=N/i;j++)
p[i*j]=1;
}
}
ll ola(ll n){//欧拉函数
ll r,aa;
r=aa=n;
for(ll i=2;i<=sqrt(n);i++){
if(!p[i]){
if(aa%i==0){
r=r/i*(i-1);
while(aa%i==0)
aa/=i;
}
}
}
if(aa>1)
r=r/aa*(aa-1);
return r;
}
int main()
{
prime();
while(~scanf("%I64d%s%I64d",&A,s,&C)){
ll l=strlen(s); B=0;
ll oc=ola(C);
ll i,ans;
for( i=0;i<l;i++){
B=B*10+s[i]-'0';
if(B>oc) break;
}
if(i==1)
ans=mypow(A,B);
else{
B=0;
for( i=0;i<l;i++)//降幂
B=(B*10+s[i]-'0')%oc;
ans=mypow(A,B+oc);
}
cout<<ans<<endl;
}
return 0;
}