P4139 上帝与集合的正确用法
2022/8/30 23:24:12
本文主要是介绍P4139 上帝与集合的正确用法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
求
\[2^{2^{2^{2^{2^{...}}}}}mod\,p \]\[p\leq 10^7 \]显然硬干是不行的,那么考虑别的思路。设 \(f(p)\) 为原式模 \(p\) 的解,那么 \(f(p)=2^{f(\varphi(p))+\varphi(x)}\) ,递归可以求出上一项的值即可,边界是 \(\varphi(p)=1\) 时 \(f(p)=0\) ,需要预处理出 \(\varphi\) 的值。
#include<bits/stdc++.h> using namespace std; #define ll long long int prime[10000005],phi[10000005],tot; bool not_prime[10000005]; int t,pp; void getp(){ phi[1]=1; for(int i=2;i<=10000000;++i){ if(not_prime[i]==0){ prime[++tot]=i; phi[i]=i-1; } for(int j=1;(prime[j]*i)<=10000000 && j<=tot;++j){ not_prime[i*prime[j]]=1; if((i%prime[j])==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } } ll Qpow(ll a,ll b,ll p){ ll ret=1; while(b){ if(b&1) ret=(ret*a)%p; b>>=1; a=(a*a)%p; } return ret; } ll f(ll x){ if(phi[x]==1) return 0; ll q=f(phi[x]); return Qpow(2,q+phi[x],x); } int main(){ getp(); scanf("%d",&t); while(t--){ scanf("%d",&pp); printf("%lld\n",f(pp)); } return 0; }
这篇关于P4139 上帝与集合的正确用法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行
- 2024-05-08阿里云域名注册流程,分享给第一次购买域名的新手站长!