给n和模数mod,求exponial(n)%mod
欧拉降幂:
借鉴了直接将modulo改写的写法:
inline ll modulo(ll x, ll mod){return x < mod ? x : x % mod + mod;}
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline ll phi(int x){
ll ans = x;
for (ll i = 2;i*i <=x;i++){
if (x% i == 0){
ans = ans/i*(i-1);
while (x %i == 0) x/=i;
}
}
if (x>1) ans = ans / x *(x-1);
return ans;
}
ll gcd(ll a,ll b){
if (b == 0) return a;
return gcd(b,a%b);
}
inline ll modulo(ll x,ll mod){
return x < mod?x:x %mod+mod;
}
ll pow_(ll a,ll b,ll p){
ll ret = 1;
while (b){
if (b & 1) ret =modulo(ret*a,p);
a = modulo(a*a,p);
b >>= 1;
}
return ret;
}
ll f(ll a,ll k,ll p){
if (p == 1) return 1;
if (k == 0) return 1;
return pow_(a,f(a-1,k-1,phi(p)),p);
}
int main(){
ll n,m;
cin >> n >> m;
ll ans = f(n,n-1,m) % m;
cout << ans ;
}