题目描述:
贴一个官方题解:
题目思路,用指数降幂公式做,注意开long long。
代码参考@W4k3Up @徐航
感谢@qq_36704031 指正,之前的代码的确有问题,非常感谢这位兄弟能指出我的错误。
AC代码:(已改正)
/* Urozero Autumn Training Camp 2016 Day 1: NCPC-2016, Friday, November 25, 2016 Problem E. Exponial 2017年9月3日14:21:27 2017年10月5日13点18分 更正 AC 指数降幂公式 */ #include <iostream> #include <map> #include <set> #include <string> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <vector> using namespace std; typedef long long ll; ll n,m,ans; ll euler(ll n){ //返回euler(n) ll res=n,a=n; for(ll i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } ll fast_mod(ll x,ll n,ll Max) { ll res=1; while(n>0) { if(n & 1) res=(res*x)%Max; x=(x*x)%Max; n >>= 1; } return res; } ll func(ll n,ll m){ if(m==1) return 0; if(n==1) return 1; else if(n==2) return 2%m; else if(n==3) return 9%m; else if(n==4) return fast_mod(4,9,m); /* if(n<=4){ ll ans=1; for(int i=1;i<=n;i++){ ans=fast_mod(i,ans,m); } return ans; } */ else{ ll phi=euler(m); ll z=func(n-1,phi); ans=fast_mod(n,phi+z,m); } return ans; } void solve(){ scanf("%lld%lld",&n,&m); printf("%lld\n",func(n,m)); } int main(){ solve(); return 0; }