题意
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
思路
欧拉降幂公式
a ^ p % q == a ^ (p % phi(q) + phi(q)) % q;
p >= phi(q)
链接
https://vjudge.net/contest/176263#problem/B
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 10;
LL A, B, C;
char str[maxn];
LL get_phi(LL C)
{
LL res = C;
for(int i= 2; i * i <= C; i++)
{
if(C % i == 0)
{
res = res / i * (i - 1);
while(C % i == 0) C /= i;
}
}
if(C > 1) res = res / C * (C - 1);
return res;
}
LL get_B(char str[], LL C)
{
LL res = 0;
int len = strlen(str);
for(int i= 0; i< len; i++)
res = (res * 10 + str[i] - '0') % C;
return res;
}
LL solve(LL A, LL B, LL C)
{
LL res = 1, t = A;
while(B > 0)
{
if(B & 1) res = (res * t) % C;
t = (t * t) % C;
B >>= 1;
}
return res;
}
int main()
{
//freopen("in.txt", "r", stdin);
while(cin >> A)
{
scanf(" %s", str);
cin >> C;
LL phiC = get_phi(C);
B = get_B(str, phiC);
cout << solve(A, B, C) << endl;
}
return 0;
}