[bzoj3884]上帝与集合的正确用法
2017-11-18 22:00
197 查看
题意:求${2^{{2^{{2^{...}}}}}}\bmod p$
解题关键:
因为${a^n} \equiv {a^{n\bmod \varphi (p) + \varphi (p)}}\bmod p,n > \varphi (p)$
所以,
$\begin{array}{l}
f(p) = {2^{{2^{{2^{...}}}}}}\bmod p = {2^{{2^{{2^{...}}}}\bmod \varphi (p) + \varphi (p)}}\bmod p\\
= {2^{f(\varphi (p)) + \varphi (p)}}\bmod p
\end{array}$
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAXN=10000000+10; int prime[MAXN];//保存素数 bool vis[MAXN];//初始化 int phi[MAXN];//欧拉函数 void Lphisieve(int n){ int cnt=0; for(int i=2;i<n;i++){ if(!vis[i]){ prime[cnt++]=i; phi[i]=i-1; } for(int j=0;j<cnt&&i*prime[j]<n;j++){ int k=i*prime[j]; vis[k]=true; if(i%prime[j]==0){ phi[k]=phi[i]*prime[j]; break; } else phi[k]=phi[i]*(prime[j]-1); } } } ll mod_pow(ll x,ll n,ll p){ ll res=1; while(n){ if(n&1) res=res*x%p; x=x*x%p; n>>=1; } return res; } ll work(ll n){ if(n==1) return 0; return mod_pow(2,work(phi )+phi ,n); } int main(){ int T; Lphisieve(10000001); scanf("%d", &T); while(T--){ ll n; scanf("%lld",&n); printf("%lld\n",work(n)); } return 0; }
相关文章推荐
- [BZOJ 3884] 上帝与集合的正确用法 欧拉定理
- 【BZOJ3884】上帝与集合的正确用法
- [题解] BZOJ 3884 上帝与集合的正确用法
- 【BZOJ3884】上帝与集合的正确用法 [欧拉定理]
- BZOJ3884: 上帝与集合的正确用法
- BZOJ 3884(上帝与集合的正确用法-欧拉函数递推找极限)[Template:数论 V2]
- [BZOJ 3884]上帝与集合的正确用法
- BZOJ 3884 上帝与集合的正确用法 欧拉定理
- bzoj3884 上帝与集合的正确用法
- BZOJ 3884 上帝与集合的正确用法
- 数论专题练习:【bzoj3884】上帝与集合的正确用法
- 【BZOJ 3884】 上帝与集合的正确用法
- 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理
- bzoj 3884: 上帝与集合的正确用法
- 【BZOJ 3884】上帝与集合的正确用法【欧拉降幂】
- BZOJ 3884 上帝与集合的正确用法
- 【BZOJ 3884】【欧拉定理或者求幂大法】上帝与集合的正确用法
- bzoj千题计划264:bzoj3884: 上帝与集合的正确用法
- BZOJ3884: 上帝与集合的正确用法
- bzoj 3884: 上帝与集合的正确用法 (数论)