Problem Description
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
Input
Output
Sample Input
Sample Output
解题思路:B太大不能直接算,C也很大,不能找循环,这里是A^x=A^(x % phi(c) + phi(c) ) (mod c) (x>=phi(c)) 这个公式的利用,具体实现就是一个求一个数的欧拉函数,一个快速幂,一个字符串转换的函数,注意用scanf,否则会超时。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long llong;
llong eular(llong n)
{
llong i,ans=n;
for(i=2;i*i<=n;++i)
if(n%i==0)
{
ans-=ans/i;
while(n%i==0)
n/=i;
if(n==1)
break;
}
if(n!=1)
ans-=ans/n;
return ans;
}
llong quickpow(llong a,llong b,llong c)
{
llong ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%c;
b>>=1;
a=(a*a)%c;
}
return ans;
}
llong stol(char a[],llong n)
{
llong i,ans=0;
bool flag=false;
for(i=0;a[i]!='\0';++i)
{
ans=ans*10+(a[i]-'0');
if(ans>=n)
{
flag=true;
ans%=n;
}
}
if(flag==true)
ans+=n;
// cout<<ans<<endl;
return ans;
}
int main()
{
llong a,lb,c,phi;
char b[1000005];
while(scanf("%I64d %s %I64d",&a,b,&c)!=EOF)
{
phi=eular(c);
lb=stol(b,phi);
// cout<<quickpow(a,lb,c)<<endl;
printf("%I64d\n",quickpow(a,lb,c));
}
return 0;
}