欧拉降幂的结论,
有关欧拉算法的总结: https://blog.csdn.net/Ven21959/article/details/96159829
有关快速幂的总结: https://blog.csdn.net/Ven21959/article/details/99671654
例题(欧拉+快速幂):
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
AC代码
#include <iostream>
#include <cstring>
#include<cstdio>
using namespace std;
#define LL long long
LL a,c;
char s[1000005];
LL power(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",power(a,ans));
}
return 0;
}