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 }