Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
For each testcase, output an integer, denotes the result of A^B mod C.
3 2 4 2 10 1000
1 24
比较裸的欧拉函数降幂的应用题。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 1e6+7;
char b[MAXN];
LL quick_mod(LL a,LL b,LL mod)
{
LL sum = 1,base = a;
while(b)
{
if(b&1)sum = sum*base%mod;
base = base*base%mod;
b >>= 1;
}
return sum;
}
//直接求phi
int get_phi(int c)
{
LL ans = c;
int m = sqrt(c+0.5);
for(int i = 2; i <= m; ++i)
{
if(c % i == 0)
{
ans = ans/i*(i-1);
while(c % i ==0)c/=i;
}
}
if(c > 1)ans = ans/c*(c-1);
return ans;
}
int main()
{
LL a,c;
while(~scanf("%I64d%s%I64d",&a,b,&c))
{
int l = strlen(b);
LL phi = get_phi(c);
LL b1 = 0;
for(int i = 0; i < l; ++i)b1 = (b1*10+b[i]-'0')%phi;
a%=c;
printf("%I64d\n",quick_mod(a,b1+phi,c));
}
return 0;
}