Roommate to thank the board.
Is a board problem, we must also needed.
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<map>
#define MOD(a, b) a >= b ? a % b + b : a
using namespace std;
typedef long long ll;
map<ll, ll>mp;
ll fast_pow(ll a, ll b, ll m)
{
ll res = 1;
while(b)
{
if(b & 1)
{
res = MOD(res * a, m);
}
a = MOD(a * a, m);
b >>= 1;
}
return res;
}
ll phi(ll n)
{
ll ans = n;
ll k = n;
if(mp.count(k)) return mp[k];
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;
mp[k] = ans;
return ans;
}
ll solve(ll a, ll b, ll m)
{
if(m == 1) return 0;
if(b <= 1) return fast_pow(a, b, m);
ll p = phi(m);
ll t = solve(a, b - 1, p);
ll g = __gcd(a, m);
if(g == 1 || b < p) return fast_pow(a, t, m);
else
return fast_pow(a, p + t, m);
}
int main()
{
ll a, b, m;
int t;
scanf("%d", &t);
while(t--)
{
scanf("%lld%lld%lld", &a, &b, &m);
printf("%lld\n", solve(a, b, m) % m);
}
return 0;
}