https://nanti.jisuanke.com/t/41299
分析:题目给出a,b,mod求满足条件的最小a,由题目的式子得,每次只要能递归下去,b就会+1,所以就可以认为b其实是次数,什么的次数?对数函数的反函数。。。。即题目求a的a次方的a次方.....一直搞b次后求得的答案。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int M=1e6+6; ll ph[M]; ll init(){ ph[0]=0,ph[1]=1; for(int i=2;i<M;i++) ph[i]=i; for(int i=2;i<M;i++){ if(ph[i]==i){ for(int j=i;j<M;j+=i) ph[j]=ph[j]/i*(i-1); } } } ll ksm(ll a,ll b,ll mod){ ll t=1ll; while(b){ if(b&1) t=(t*a)%mod; b>>=1; a=(a*a)%mod; } return t; } ll dfs(ll a,ll b,ll p){ if(b==0) return 1; if(p==1) return 0; ll P=dfs(a,b-1,ph[p]); if(P<ph[p]&&P) return ksm(a,P,p); return ksm(a,P+ph[p],p); } int main(){ int t; scanf("%d",&t); init(); while(t--){ ll a,b,mod; scanf("%lld%lld%lld",&a,&b,&mod); printf("%lld\n",dfs(a,b,mod)%mod); } return 0; }View Code