【数论 费马小定理】P4139 上帝与集合的正确用法
直接递归求解
先用线性筛,筛一下phi
代码
#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=1e7+5; int phi[maxn],prime[maxn],tot; void init() { phi[1]=1; for(int i=2;i<=maxn;i++) { if(!phi[i]) { prime[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot;j++) { if(prime[j]*i>maxn) break; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int qpow(int a,int b,int mod) { int res=1; while(b) { if(b&1) res=(res*a)%mod; b>>=1; a=(a*a)%mod; } return res; } int calc(int x) { if(x==1) return 0; return qpow(2,calc(phi[x])+phi[x],x); } signed main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); init(); int t,p; scanf("%d",&t); while(t--) { scanf("%lld",&p); printf("%lld\n",calc(p)); } return 0; }