目前看來這個歐拉降冪的取模操作MOD函數需要在快速冪中使用,代替%號取模,m是模數,a應該是被取模數,但是根據圖片,a應該是指數,等一個大佬。
最後輸出結果的時候還要再對m取模
#include <bits/stdc++.h>
#define eps 1e-14
#define pi acos(-1)
#define ll long long
#define RD T*(rand()*2-RAND_MAX)
#define Drand (long double)rand()/RAND_MAX
#define LINF 0x7f7f7f7f7f7f7f7f
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e5+100;
const long long mod=1e18;
ll MOD(ll a,ll m){return a>m?a%m+m:a;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll q_pow(ll a,ll b,ll mod)
{
ll sum=1;
while(b){
if(b&1) sum=sum*a%mod;
a=a*a%mod;
b>>=1;
}
return sum%mod;
}
ll q_pow_mod(ll a,ll b,ll mod)
{
if(mod==0)return 0;
ll sum=1;
while(b){
if(b&1) sum=MOD(sum*a,mod);
a=MOD(a*a,mod);
b>>=1;
}
return MOD(sum,mod);
}
ll phi(ll n)
{
ll ans = n;
for(int i = 2; i*i <= n; i++)
{
if(n % i == 0)
{
ans -= ans/i;
while(n % i == 0)
n /= i;
}
}
if(n > 1)ans -= ans/n;
return ans;
}
int cal(int a,int b,int m)
{
if(b==1 || m==1)
{
return MOD(a,m);
}
return q_pow_mod(a,cal(a,b-1,phi(m)),m);
}
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int t;
scanf("%d",&t);
while(t--){
int a,b,m;
scanf("%d%d%d",&a,&b,&m);
if(a==1 || b==0)
{
printf("%d\n",1%m);
continue;
}
printf("%d\n",cal(a,b,m)%m);
}
return 0;
}