2016-2017-acmicpc-nordic-collegiate-programming-contest-ncpc-2016
Problem E Exponial
题目链接 http://codeforces.com/gym/101550/attachments
欧拉降幂的模板题。日常膜拜欧拉函数。
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 1e5+100;
ll quick_pow(ll x, ll cnt, ll mod) {
ll ans = 1;
while(cnt) {
if(cnt&1) ans *= x;
x *= x;
ans %= mod;
x %= mod;
cnt >>= 1;
}
return ans;
}
ll eular(ll x) {
ll res = x;
for(int 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 /= x;
res *= (x-1);
}
return res;
}
ll solve(ll n, ll m) {
if(m == 1) return 0;
ll phi = eular(m);
ll z = solve(n-1, phi);
return quick_pow(n, phi+z, m);
}
int main() {
ll n, m;
//freopen("1.in", "r", stdin);
scanf("%lld%lld", &n, &m);
if(n <= 5) {
ll ans = 1;
for(int i=1;i<=n;i++) {
ans = quick_pow(i, ans, m);
}
printf("%lld\n", ans);
return 0;
}
printf("%lld", solve(n, m));
}