bzoj 3884 上帝与集合的正确用法

 

题面

https://www.lydsy.com/JudgeOnline/problem.php?id=3884

题解

用扩展欧拉定理

等于a

然后有

这样我们只要求a mod phi(p) 的值就可以求a mod p 的值

递归直到某一层p=1为止

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 ll read(){
 6     ll x=0,f=1;char c=getchar();
 7     while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
 8     while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
 9     return x*f;
10 }
11 
12 int t;
13 int p;
14 
15 inline int calc(int x){
16     int ret=x,t=x;
17     for(int i=2;i*i<=t;i++){
18         if(x%i==0) ret=ret/i*(i-1);
19         while(x%i==0) x=x/i;
20     }
21     if(x>1) ret=ret/x*(x-1);
22     return ret;
23 }
24 
25 int ksm(int x,int p,int mod){
26     if(p==0) return 1;
27     int ret=1;
28     while(p){
29         if(p&1) ret=ret*1ll*x%mod;
30         x=x*1ll*x%mod;
31         p=p>>1;
32     }
33     return ret;
34 }
35 
36 int work(int mod){
37     if(mod==1) return 0;
38     int phi=calc(mod);
39     int nw=work(phi);
40     return ksm(2,nw+phi,mod)%mod;
41 }
42 
43 int main(){
44 #ifdef LZT
45     //freopen("in","r",stdin);
46 #endif
47     t=read();
48     while(t--){
49         p=read();
50         printf("%d\n",work(p));
51     }
52     return 0;
53 }

 

posted @ 2018-07-28 18:19  wawawa8  阅读(123)  评论(0编辑  收藏  举报