[bzoj3884]上帝与集合的正确用法
这道题需要用到扩展欧拉定理,即$a^{b}\equiv a^{b\ mod\ \phi(m)+\phi(m)}(mod\ \phi(m))$
不断递归计算,奇数的phi值一定是偶数,偶数的phi值一定会除以2,即log次递归
还有phi可以用线性筛计算,也可以在线计算(复杂度分别是$o(p+Tlog^{2}p)$和$o(Tlogp\sqrt{p})$)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10000005 4 int t,n,vis[N],phi[N],p[N]; 5 int ksm(int n,int p){ 6 if (!n)return 1; 7 int s=ksm(n>>1,p); 8 s=1LL*s*s%p; 9 if (n&1)s=s*2%p; 10 return s; 11 } 12 int dfs(int k,int p){ 13 if (p==1)return 0; 14 return ksm(dfs(k-1,phi[p])+phi[p],p); 15 } 16 int main(){ 17 phi[1]=1; 18 for(int i=2;i<N-4;i++){ 19 if (!vis[i]){ 20 p[++p[0]]=i; 21 phi[i]=i-1; 22 } 23 for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){ 24 vis[i*p[j]]=1; 25 if (i%p[j]==0){ 26 phi[i*p[j]]=phi[i]*p[j]; 27 break; 28 } 29 phi[i*p[j]]=phi[i]*(p[j]-1); 30 } 31 } 32 scanf("%d",&t); 33 while (t--){ 34 scanf("%d",&n); 35 printf("%d\n",dfs(1e9,n)); 36 } 37 }