a b ≡ { a b m o d ϕ ( m ) gcd ( a , m ) = 1 a b gcd ( a , m ) ≠ 1 ∧ b < ϕ ( m ) a b m o d ϕ ( m ) + ϕ ( m ) gcd ( a , m ) ≠ 1 ∧ b ≥ ϕ ( m ) a^b~\equiv~\begin{cases}a^{b~mod~\phi(m)} &\gcd(a,m)~=~1 \\a^b &\gcd(a,m)~\neq~1~\land~b~<~\phi(m) \\ a^{b~mod~\phi(m)~+~\phi(m)} &\gcd(a,m)~\neq~1~\land~b~\geq~\phi(m)\end{cases} ab ≡ ⎩⎪⎨⎪⎧ab mod ϕ(m)abab mod ϕ(m) + ϕ(m)gcd(a,m) = 1gcd(a,m) = 1 ∧ b < ϕ(m)gcd(a,m) = 1 ∧ b ≥ ϕ(m) https://www.luogu.org/problemnew/show/P5091
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e7 + 5, mod = 1e9 + 7;
ll phim, m, numb, phinumb;
ll euler(ll x)
{
ll res = x;
for(ll i = 2; i * i <= x; ++i){
if(x % i == 0){
res = res / i * (i - 1);
while(x % i == 0) x /= i;
}
}
if(x > 1) res = res / x * (x - 1);
return res;
}
ll quickpow(ll x, ll k)
{
ll res = 1;
while (k){
if (k & 1) res = res * x % m;
x = x * x % m;
k >>= 1;
}
return res;
}
void cal(char *a)
{
int la = strlen(a);
for (int i = 0; i < la; ++i){
phinumb = (phinumb * 10 + a[i] - '0') % phim;
numb = (numb * 10 + a[i] - '0') % m;
}
}
char b[maxn];
int main()
{
ll a;
scanf("%lld %lld %s", &a, &m, b);
phim = euler(m);
cal(b);
if (__gcd(a, m) == 1){
printf("%lld\n", quickpow(a, phinumb));
}else{
int lb = strlen(b);
if (lb < 9){
ll sum = 0;
for (int i = 0; i < lb; ++i){
sum = sum * 10 + b[i] - '0';
}
if (sum < phim) printf("%lld\n", quickpow(a, numb));
else printf("%lld\n", quickpow(a, phinumb + phim));
}else printf("%lld\n", quickpow(a, phinumb + phim));
}
return 0;
}