博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4139 上帝与集合的正确用法
阅读量:2153 次
发布时间:2019-04-30

本文共 1142 字,大约阅读时间需要 3 分钟。

题目描述

一句话题意: 2 2 2 2... m o d   p 2^{2^{2^{2...}}} mod\ p 2222...mod p

输入格式

第一行一个整数T,表示数据个数。

接下来T行,每行一个正整数p,代表你需要取模的值

输出格式

T行,每行一个正整数,为答案对p取模后的值

输入输出样例

输入

3236

输出

014

说明/提示

对于100%的数据, T ≤ 1000 , p ≤ 1 0 7 T\le 1000,p \le 10^7 T1000p107

题解

扩展欧拉定理:

在这里插入图片描述
于是我们就可以照着上面的式子不断递归,m会逐渐变小,当m=1时就可退出递归。
我们会发现这题只会用上面的第二个式子,因为 b = 2 2 2 2... b=2^{2^{2^{2...}}} b=2222...相当于无限,定大于 φ ( m ) φ(m) φ(m)
还要预处理出 φ φ φ 欧拉函数,参考。
且递归时求幂时要用快速幂,否则会炸。

代码

#include
#include
#define m 10000001#define ll unsigned long longusing namespace std;int phi[m],p[m>>3],pn,f[m],t,mp,modp;void Phi()//线性筛欧拉函数{
phi[1]=1; for(int i=2; i<=m; i++) {
if(!f[i]) {
p[++pn]=i; phi[i]=i-1; } for(int j=1; j<=pn&&i*p[j]<=m; j++) {
f[i*p[j]]=1; if(i%p[j]==0) {
phi[i*p[j]]=phi[i]*p[j]; break; } else phi[i*p[j]]=phi[i]*(p[j]-1); } }}int fpow(ll a,int b,int mod)//快速幂{
ll ans=1; while(b) {
if(b&1) ans=(ans*a)%mod; a=(a*a)%mod; b>>=1; } return ans;}int solve(ll mp){
if(mp==1) return 0; return fpow(2,solve(phi[mp])+phi[mp],mp);}int main(){
Phi(); cin>>t; for(int i=1; i<=t; i++) {
cin>>modp; cout<
<

转载地址:http://phpwb.baihongyu.com/

你可能感兴趣的文章
什么是 Q-learning
查看>>
用一个小游戏入门深度强化学习
查看>>
如何应用 BERT :Bidirectional Encoder Representations from Transformers
查看>>
5 分钟入门 Google 最强NLP模型:BERT
查看>>
强化学习第1课:像学自行车一样的强化学习
查看>>
强化学习第2课:强化学习,监督式学习,非监督式学习的区别
查看>>
强化学习第3课:有些问题就像个赌局
查看>>
强化学习第4课:这些都可以抽象为一个决策过程
查看>>
强化学习第5课:什么是马尔科夫决策过程
查看>>
强化学习第6课:什么是 Crossentropy 方法
查看>>
强化学习第7课:交叉熵方法的一些局限性
查看>>
强化学习 8: approximate reinforcement learning
查看>>
图解什么是 Transformer
查看>>
代码实例:如何使用 TensorFlow 2.0 Preview
查看>>
6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现
查看>>
走进JavaWeb技术世界1:JavaWeb的由来和基础知识
查看>>
走进JavaWeb技术世界2:JSP与Servlet的曾经与现在
查看>>
走进JavaWeb技术世界3:JDBC的进化与连接池技术
查看>>
走进JavaWeb技术世界4:Servlet 工作原理详解
查看>>
走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程
查看>>