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-01为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署