版权声明:SDKD-Vici__ https://blog.csdn.net/Vici__/article/details/82984569
题意:
给定两个数n和m,求 。
题解:
使用欧拉定理降幂公式:
这里引用一位大佬的公式证明:欧拉降幂公式的证明
代码:
#include <iostream> #include <algorithm> #include <cstdio> typedef long long int ll; using namespace std; ll quick_pow(ll a,ll b,ll m) { ll ans=1; while(b) { if(b&1) ans=(ans*a)%m; a=(a*a)%m; b/=2; } return ans; } ll phi(ll m) { ll ans=m; for(ll i=2; i*i<=m; i++) { if(m%i) continue; while(m%i==0) m/=i; ans=ans/i*(i-1); } if(m!=1) ans=ans/m*(m-1); return ans; } ll f(ll n,ll m) { if(m==1) return 0; if(n==1) return 1%m; if(n==2) return 2%m; if(n==3) return 9%m; if(n==4) return 262144%m; ll p=phi(m); return quick_pow(n,p+f(n-1,p),m); } int main() { ll n,m; scanf("%lld%lld",&n,&m); printf("%lld\n",f(n,m)%m); return 0; }