题目来源:https://nanti.jisuanke.com/t/41299
题意理解完之后发现也就是a的a次幂的a次幂...一共b次,直接欧拉降幂做即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long ll;
const ll MAX=1e6+10;
map<ll,ll>euler;
ll phi[MAX],a[100100];
ll MOD(ll n,ll mod)
{
return n<mod?n:(n%mod+mod);
}
void Euler()
{
phi[1]=1;
for(ll i=2;i<MAX;i++)
phi[i]=i;
for(ll i=2;i<MAX;i++)
if(phi[i]==i)
for(ll j=i;j<MAX;j+=i)
phi[j]=phi[j]/i*(i-1);
}
ll quickpow(ll a,ll n,ll mod)
{
ll res=1;
a=MOD(a,mod);
while(n)
{
if(n&1)
{
res=MOD(a*res,mod);
}
n>>=1;
a=MOD(a*a,mod);
}
return res;
}
ll solve(ll a,ll b,ll mod)
{
if(b==1||mod==1)
return MOD(a,mod);
{
return quickpow(a,solve(a,b-1,phi[mod]),mod);
}
}
int main()
{
Euler();
int T;
scanf("%d",&T);
while(T--)
{
ll a,b,m;
scanf("%lld %lld %lld",&a,&b,&m);
if(b==0)
{
printf("%lld\n",1%m);
continue;
}
ll ans=solve(a,b,m);
ans%=m;
if(!T)
printf("%lld",ans);
else
printf("%lld\n",ans);
}
return 0;
}