[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})$)

 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 }
View Code

 

posted @ 2019-09-04 14:25  PYWBKTDA  阅读(148)  评论(0编辑  收藏  举报