链接:https://nanti.jisuanke.com/t/41299
来源:The Preliminary Contest for ICPC Asia Nanjing 2019
欧拉降幂公式:
题意及思路见下图:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL euler_phi(LL n){//欧拉函数
LL m=(LL)sqrt(n+0.5);
LL ans=n;
for (LL i=2;i<=m;i++){
if (n%i==0){
ans=ans/i*(i-1);
while (n%i==0) n/=i;
}
}
if (n>1) ans=ans/n*(n-1);
return ans;
}
LL power(LL a,LL b,LL p){//快速幂
LL ans=1,res=a;
while(b){
if(b&1)ans=(ans*res)%p;
res=res*res%p;
b>>=1;
}
return ans;
}
LL cal(LL a,LL b,LL p){
if(b==0||p==1) return 1;
int pp=euler_phi(p);//mod
int bb=cal(a,b-1,pp);//幂
if(bb<pp&&bb) return power(a,bb,p);//第二类
else return power(a,bb%pp+pp,p);//第三类
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int a,b,p;
scanf("%d%d%d",&a,&b,&p);
int ans=cal((LL)a,(LL)b,(LL)p)%p;
printf("%d\n",ans);
}
return 0;
}