求$$2^{2^{2^{2^{…}}}} mod n$$的值,其中n有1e7。

老实说这题挺有趣的,关键是怎么化掉指数,由于是取模意义下的无限个指数,所以使用欧拉定理一定是可以把指数变为不大于$\varphi(n)$的,但是我们连上一层指数的值都不知道,怎么化阿...

考虑同余定理,把n变为$n=2^k·s$的形式,然后$2^k$先提取出来,这样每向一层模数会减少,最后到1这样最后一层可以得到0的值了,回溯时计算完一层的指数时再把$2^k$乘回去就好了

/** @Date    : 2017-09-11 21:22:36
* @FileName: bzoj 3884 欧拉降幂.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e7+20;
const double eps = 1e-8; LL fpow(LL a, LL n, LL mod)
{
LL res = 1;
while(n)
{
if(n & 1)
res = (res * a % mod + mod) %mod;
a = (a * a % mod + mod ) % mod;
n >>= 1;
}
return res;
} int pri[N];
int phi[N];
int c = 0;
void prime()
{
MMF(phi);
phi[1] = 1;
for(int i = 2; i < N; i++)
{
if(!phi[i])
pri[c++] = i, phi[i] = i - 1;
for(int j = 0; j < c && i * pri[j] < N; j++)
{
phi[i * pri[j]] = 1;
if(i % pri[j] == 0)//是倍数i=kp, phi(kpp)=kpp*[phi(kp)/kp]=p*phi(kp)
{
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
else //积性函数性质 (i, p) = 1, phi(ip)=phi(i)*phi(p)
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
} int get_phi(int x)
{
int phi = x;
for(int i = 2; i * i <= x; i++)
{
if(x % i == 0)
{
while(x % i==0)
x /= i;
phi = phi / i * (i - 1);
}
}
if(x > 2)
phi = phi / x * (x - 1);
return phi;
} int dfs(int p)
{
if(p == 1)
return 0;
int k = 0;
while(p % 2 == 0)
p>>=1, k++;
int s = p;
int phis = get_phi(s);/*phi[s];*/
int nxe = dfs(phis);//模数向上递归
nxe = (nxe - k % phis + phis) % phis;//欧拉降幂
nxe = fpow(2, nxe, s) % s;
return nxe << k;
}
int main()
{
int T;
//prime();
cin >> T;
while(T--)
{
int mod;
scanf("%d", &mod);
printf("%d\n", dfs(mod));
}
return 0;
}

bzoj 3884 欧拉定理的更多相关文章

  1. BZOJ 3884 欧拉定理 无穷幂取模

    详见PoPoQQQ的博客.. #include <iostream> #include <cstring> #include <cstdio> #include & ...

  2. [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法

    看看我们机房某畸形写的题解:http://blog.csdn.net/sinat_27410769/article/details/46754209 此题为popoQQQ神犇所出,在此orz #inc ...

  3. BZOJ 3884 拓展欧拉定理

    3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4142  Solved: 1907[Submit][Status][D ...

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

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

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

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

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

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

  7. bzoj 3884 上帝与集合的正确用法(递归,欧拉函数)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3884 [题意] 求2^2^2… mod p [思路] 设p=2^k * q+(1/0) ...

  8. BZOJ 3884 上帝与集合的正确用法

    Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...

  9. BZOJ 3884: 上帝与集合的正确用法 [欧拉降幂]

    PoPoQQQ大爷太神了 只要用欧拉定理递归下去就好了.... 然而还是有些细节没考虑好: $(P,2) \neq 1$时分解$P=2^k*q$的形式,然后变成$2^k(2^{(2^{2^{...}} ...

随机推荐

  1. 第17次Scrum会议(10/29)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/29 17:20~17:42,总计22min.地点:东北师 ...

  2. Java Web文件上传原理分析(不借助开源fileupload上传jar包)

    Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web   最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...

  3. OOP 1.2 const关键字

    1.2 const关键字 1.常量 指针常量 定义常量:const 类型 =值 定义指针常量:const *类型=值 常量指针不可通过常量指针修改其指向的内容 可直接修改其指向的内容 常量指针的指向可 ...

  4. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  5. 关于虚拟机安装mac os 教程详解

    环境搭建 VMware下载 百度云盘下载:链接:http://pan.baidu.com/s/1pK8RcLl 密码:5jc5 Unlocker208 百度云盘下载:链接:http://pan.bai ...

  6. Java的一些细节问题

    一.Java求余%的结果符号取决于除数的符号位:小数也可以求余,余数仍为小数. package com.test; public class Test { /** * @author 容杰龙 */ p ...

  7. sublime text there are no packages available for installation 解决办法

    hosts  增加一行 : #50.116.33.29       sublime.wbond.net.

  8. JAVA程序测试时用到的与内存测试有关的东西

    1.JVM启动参数 垃圾回收器调用情况参数,使用如下参数可以看到程序何时启动GC进行垃圾回收,和垃圾回收的详细信息. java Test -XX:+PrintGCDetails -XX:+PrintG ...

  9. 【C++】为多态基类声明virtual析构函数

    来自<Effective C++>条款07:为多态声明virtual析构函数 当derived class对象经由一个base class指针被删除,而该base class带着一个non ...

  10. 【C++】C++函数重载的总结

    函数重载: 出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function).一定要注意函数重载的两个关键词:形参列表和作用域. 任何程序有且仅有 ...