luogu P4139 上帝與集合的正確用法(擴充套件尤拉定理)
阿新 • • 發佈:2018-12-20
本蒟蒻現在才知帶擴充套件尤拉定理。
對於任意的\(b\geq\varphi(p)\)有
\(a^b\equiv a^{b\ mod\ \varphi(p)+\varphi(p)}(mod\ p)\)
當\(b<\varphi(p)\)有
\(a^b\equiv a^{b\ mod\ \varphi(p)}(mod\ p)\)
\(b\)和\(p\)可以不互質
然後這題就簡單了。。。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=1e7+100; #define int long long int phi[N],prime[N],num,p,t; bool book[N]; int read(){ int sum=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();} return sum*f; } void prework(int n){ phi[1]=1; for(int i=2;i<=n;i++){ if(book[i]==0){ phi[i]=i-1; prime[++num]=i; } for(int j=1;i*prime[j]<=n&&j<=num;j++){ book[i*prime[j]]=1; 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 ksm(int x,int b,int mod){ int tmp=1; while(b){ if(b&1)tmp=tmp*x%mod; b>>=1; x=x*x%mod; } return tmp; } int dfs(int x){ if(x==2)return 0; return ksm(2,dfs(phi[x])+phi[x],x); } signed main(){ prework(1e7); t=read(); while(t--){ p=read(); printf("%lld\n",dfs(p)); } return 0; }