題意:
求b個a次冪()對m求模
題解:
歐拉降冪,這題很簡單反反覆覆卻wa了13發
前七發wa的原因是題面沒更新的緣故,因爲之前的a一直都是2到1000000
後面六發總結下是因爲歐拉降冪過程中a,m是否互素的兩種情況沒有討論清楚
#include<bits/stdc++.h>
#define lowerbit(x) (x&(-x))
#define ll long long
using namespace std;
const int maxn=1e6+5;
ll gcd(ll a,ll b){
if(b==0)return a;
return gcd(b,a%b);
}
ll fast(ll x,ll y,ll mod){
ll ans=1;
if(mod==1)return 0;
while(y){
if(y&1)ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
int p[maxn];
ll okfast(ll x,ll y,ll m){
ll ans=1;
while(y){
if(y&1)ans*=x;
if(ans>=m)return -1;
x*=x;
y>>=1;
}
return ans;
}
bool ok(ll a,ll b,ll c){
ll ans=a;
if(b==0)return c==1;
if(a>=c)return true;
for(int i=1;i<b;i++){
ans=okfast(a,ans,c);
if(ans==-1)return true;
}
return false;
}
ll solve(ll a,ll b,ll m){
if(m==1)return 0;
if(b==0)return 1;
if(b==1)return a%m;
ll pp=solve(a,b-1,p[m]);
pp=pp+p[m]*(gcd(a,m)!=1&&ok(a,b-1,p[m]));
return fast(a,pp,m);
}
void phi()
{
p[1]=1;
for(int i=2;i<maxn;i++)
{
if(!p[i])
for(int j=i;j<=maxn;j+=i)
{
if(!p[j])p[j]=j;
p[j]=p[j]/i*(i-1);
}
}
}
int main(){
int t;
phi();
scanf("%d",&t);
while(t--){
ll a,b,m;
scanf("%lld%lld%lld",&a,&b,&m);
if(a==1){
if(m!=1)printf("%d\n",1);
else printf("%d\n",0);
continue;
}
printf("%lld\n",solve(a,b,m));
}
}