题目传送门

上帝与集合的正确用法

题目描述

根据一些书上的记载,上帝的一次失败的创世经历是这样的:

第一天, 上帝创造了一个世界的基本元素,称做“元”。

第二天, 上帝创造了一个新的元素,称作“α”。“α”被定义为“元”构成的集合。容易发现,一共有两种不同的“α”。

第三天, 上帝又创造了一个新的元素,称作“β”。“β”被定义为“α”构成的集合。容易发现,一共有四种不同的“β”。

第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合。显然,一共会有16种不同的“γ”。

如果按照这样下去,上帝创造的第四种元素将会有65536种,第五种元素将会有2^65536种。这将会是一个天文数字。

然而,上帝并没有预料到元素种类数的增长是如此的迅速。他想要让世界的元素丰富起来,因此,日复一日,年复一年,他重复地创造着新的元素……

然而不久,当上帝创造出最后一种元素“θ”时,他发现这世界的元素实在是太多了,以致于世界的容量不足,无法承受。因此在这一天,上帝毁灭了世界。

至今,上帝仍记得那次失败的创世经历,现在他想问问你,他最后一次创造的元素“θ”一共有多少种?

上帝觉得这个数字可能过于巨大而无法表示出来,因此你只需要回答这个数对p取模后的值即可。

你可以认为上帝从“α”到“θ”一共创造了 10^9 次元素,或 10^18 次,或者干脆∞次。

一句话题意:

$2^{2^{2^{...}}} \mod p$

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:

3
2
3
6
输出样例#1:

0
1
4

说明

对于100%的数据, $T\leq 1000 , p\leq 10^7$


  分析:

  一道扩展欧拉定理的题,实际上也比较接近于裸题了。但是有些细节要注意,而且有点卡常,另外空间有点小,一开始队列开大了然后MLE。。。。(好吧实际上是因为我用了线性筛,直接暴力求欧拉函数还会快些。。。)

  Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+;
int T,n,phi[N],q[100];
bool vis[N];
inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''&&ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
void ready()
{
int top=,k;phi[]=;
for(int i=;i<N;i++){
if(!vis[i])phi[q[++top]=i]=i-;
for(int j=;j<=top&&(k=i*q[j])<N;j++){
vis[k]=true;
if(i%q[j])
phi[k]=phi[i]*(q[j]-);
else {
phi[k]=phi[i]*q[j];break;}
}
}
}
inline int mul(int x,int y,int mod)
{
int ret=;
while(y){
if(y&)ret=(ret+x)%mod;
y>>=;x=(x+x)%mod;}
return ret;
}
inline int power(int x,int y,int mod)
{
int ret=;
while(y){
if(y&)ret=mul(ret,x,mod)%mod;
y>>=;x=mul(x,x,mod)%mod;}
return ret;
}
inline int dfs(int x)
{
if(x==)return ;
return power(,dfs(phi[x])+phi[x],x);
}
int main()
{
T=read();ready();
while(T--){
n=read();
printf("%d\n",dfs(n));
}
return ;
}

洛谷P4139 上帝与集合的正确用法 [扩展欧拉定理]的更多相关文章

  1. 洛谷 P4139 上帝与集合的正确用法 解题报告

    P4139 上帝与集合的正确用法 题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新 ...

  2. 题解-洛谷P4139 上帝与集合的正确用法

    上帝与集合的正确用法 \(T\) 组数据,每次给定 \(p\),求 \[\left(2^{\left(2^{\left(2^{\cdots}\right)}\right)}\right)\bmod p ...

  3. 洛谷 P4139 上帝与集合的正确用法

    题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容 ...

  4. 洛谷P4139 上帝与集合的正确用法 拓欧

    正解:拓展欧拉定理 解题报告: 首先放上拓欧公式? if ( b ≥ φ(p) )  ab ≡ ab%φ(p)+φ(p)(mod p)else ab≡ab mod φ(p) (mod p) 首先利用扩 ...

  5. [洛谷P4139]上帝与集合的正确用法

    题目大意:多次询问,每次给你$p$询问$2^{2^{2^{\dots}}}\bmod p$ 题解:扩展欧拉定理,求出$\varphi(p)$即可.因为$2^{2^{2^{\dots}}}>> ...

  6. 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理

    题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容 ...

  7. BZOJ.3884.上帝与集合的正确用法(扩展欧拉定理)

    \(Description\) 给定p, \(Solution\) 欧拉定理:\(若(a,p)=1\),则\(a^b\equiv a^{b\%\varphi(p)}(mod\ p)\). 扩展欧拉定理 ...

  8. bzoj3884: 上帝与集合的正确用法 扩展欧拉定理

    题意:求\(2^{2^{2^{2^{...}}}}\%p\) 题解:可以发现用扩展欧拉定理不需要很多次就能使模数变成1,后面的就不用算了 \(a^b\%c=a^{b\%\phi c} gcd(b,c) ...

  9. BZOJ 3884: 上帝与集合的正确用法 扩展欧拉定理 + 快速幂

    Code: #include<bits/stdc++.h> #define maxn 10000004 #define ll long long using namespace std; ...

随机推荐

  1. centos7下安装配置jenkins+git+maven+jdk

    环境 centos7 jdk1.8 maven3 git 在安装jenkins之前,先安装jdk1.8.maven.git 一. 安装jdk1.8 第一步:下载 jdk-8u131-linux-x64 ...

  2. IBatisNet+Oracle.ManagedDataAccess打造无需安装oracle客户端和ODP即可连接oracle数据库

    库环境: Oracle.ManagedDataAccess 版本:4.122.1.0 IBatisNet  版本:1.6.2 其实很简单的,只需在驱动配置那里添加上Oracle.ManagedData ...

  3. JSTL获取当日时间与数据时间比较

    <jsp:useBean id="now" class="java.util.Date" /> <fmt:formatDate value=& ...

  4. 2-sat Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) D

    http://codeforces.com/contest/782/problem/D 题意: 每个队有两种队名,问有没有满足以下两个条件的命名方法: ①任意两个队的名字不相同. ②若某个队 A 选用 ...

  5. synchronized的实现原理

    常见三种使用方法: 1)普通同步方法,锁是当前实例: 2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁: 3)对于同步代码块,锁是synchronized括 ...

  6. 【BZOJ】2243 [SDOI2011]染色

    [算法]树链剖分+线段树 [题解] 树链剖分算法:http://www.cnblogs.com/onioncyc/p/6207462.html 定义线段树结构体有l,r,lc,rc,sum,data. ...

  7. 20155117王震宇 实验一《Java开发环境的熟悉》实验报告

    (一)使用JDK编译.运行简单的java程序 命令创建实验目录 输入mkdir 2051117 创建以自己学号命名的文件夹,通过cd命令移动到指定文件夹,输入mkdir exp1创建实验文件夹. 打开 ...

  8. 面向对象 ( OO ) 的程序设计——理解对象

    本文地址:http://www.cnblogs.com/veinyin/p/7607938.html  1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可 ...

  9. 使用OpenCV和Python进行人脸识别

    介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...

  10. Tinyos Makerules解读

    Makerules 文件解读 位于/opt/tinyos-2.1.2/support/make #-*-Makefile-*- vim:syntax=make #$Id: Makerules,v 1. ...