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
思路:先求出模值C的欧拉值,然后用欧拉降幂,接着用快速幂即可
代码如下
#include <iostream>
#include <cstring>
using namespace std;
#define LL long long
LL a,c;
char s[1000005];
LL kpow(LL x,LL n) // x^n%MAX
{
LL res=1;
while(n>0)
{
if(n & 1)
res=(res*x)%c;
x=(x*x)%c;
n >>= 1;
}
return res;
}
//直接求解欧拉函数
LL euler(LL n)
{ //返回euler(n)
LL res=n,a=n;
for(LL i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
int main()
{
while(~scanf("%d%s%d",&a,s,&c))
{
int len=strlen(s);
LL mod=euler(c);
LL ans=0;
for(int i=0;i<len;i++)
ans=(ans*10+s[i]-'0')%mod;
ans+=mod;
printf("%lld\n",kpow(a,ans));
}
return 0;
}