刚开始我想的是欧拉降幂,可是觉得复杂度还是挺高的就去找了一下题解。

思路大方向没有问题,仍然是使用欧拉函数降低指数然后递归处理。但是不是简单的使用欧拉降幂而是应该对模数p稍微处理一下。因为底数已经确定为2,所以我们可以将p写成p=2k*q,q为奇数的形式,则

22的无穷次方%p=2k(22的无穷次方-k%q)

这样可以直接对新的指数直接模q的欧拉函数值进行处理,因为每次q为奇数,q的欧拉函数值一定为偶数(他的因子一定是奇素数,奇素数的欧拉函数值一定是偶数),所以每次至少将p变为原来的一半,所以复杂度比较低。因为用到的欧拉函数值不是很多,所以直接求单点的欧拉函数值即可。

需要注意的是指数-k模欧拉函数值时应该保证指数大于0

AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<map>
#include<queue>
#include<set>
#include<vector>using namespace std;typedef long long ll;
const int MAXN=1e5+5;ll p;ll quick_pow(ll a,ll b,ll p)
{a%=p; ll ret=1;while(b){if(b&1) ret=ret*a%p;a=a*a%p; b>>=1;}return ret;
}ll quick_pow(ll a,ll b)
{ll ret=1;while(b){if(b&1) ret*=a;a*=a; b>>=1;}return ret;
}ll phi(int x)
{ll ret=x;for(int i=2;i*i<=x;i++){if(x%i==0){ret=ret-ret/i;while(x%i==0) x/=i;}if(x==1) break;}if(x>1) ret=ret-ret/x;return ret;
}ll deal(ll p)
{ll k=0;while(~p&1) k++,p>>=1;if(p==1) return 0;ll phip=phi(p);return quick_pow(2,(deal(phip)-k%phip+phip)%phip,p)<<k;
}int main()
{int T;scanf("%d",&T);while(T--){scanf("%lld",&p);printf("%lld\n",deal(p));}return 0;
}

BZOJ3884上帝与集合的正确用法-欧拉函数相关推荐

  1. Summer Training day4上帝与集合的正确用法 欧拉函数+降幂公式

    这个题的指数太大了,因此要考虑用降幂公式进行降幂 记f(p) = 2^2^2... % p f(p) = 2^(2^2^2...%phi(p) + phi(p)) % p = 2^(f(phi(p)) ...

  2. 3884: 上帝与集合的正确用法 欧拉函数+降幂公式

    Orz题解 降幂公式:a^x ≡a^(x modϕ(p)+ϕ(p)) (mod p) #include<iostream> #include<cstdio> #include& ...

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

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

  4. 3884: 上帝与集合的正确用法 —— 欧拉降幂

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

  5. BZOJ-3884 上帝与集合的正确用法 欧拉定理

    再次仰望高端玩家Po姐 3884: 上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 772 Solved: 361 [Submit] ...

  6. bzoj3884 上帝与集合的正确用法

    题意:求2^2^2^2^2.......^2%p的值,T组询问. 欧拉降幂多用几次就好了. 顺便试了下fwrite输出优化 ,效果显著. #include<cstring> #includ ...

  7. [题解]bzoj3884 上帝与集合的正确用法

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

  8. BZOJ3884 上帝与集合的正确用法 (欧拉定理)

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

  9. bzoj3884上帝与集合的正确用法

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

最新文章

  1. 前端学习笔记2017.6.12 CSS控制DIV
  2. oracle 非数字型转数字型
  3. matlab读取指定路径excel文件,MATLAB读取Excel文件
  4. (案例)使用Cookie保存用户最后一次访问的时间
  5. Mysql Explain的简单使用
  6. 互联网日报 | 7月8日 星期四 | 小鹏汽车港交所上市;同程生活宣布申请破产;紫光国微市值突破千亿元...
  7. 在.net中序列化读写xml方法的总结(转载)
  8. 区块链需要学习哪些东西_区块链主要学习哪些知识?
  9. 乐视跳过服务器验证,pandwonload不能登录?试试跳过启动验证
  10. 关于计算机网络的主题报告,计算机网络与物联网工程研究所组织开展“安全先锋沙龙”主题报告活动...
  11. Angular(02)-- Angular-CLI命令
  12. 安装8in1飞行模拟器过程
  13. 6. 机器人正运动学---齐次变换矩阵的三种解读
  14. mysql2000数据库四合一_sql2000四合一版下载|microsoft sql server2000 简体中文4合一版附sql 2000 sp4 补丁_ - 极光下载站...
  15. manjaro顶部显示网速
  16. 美丽心灵 A Beautiful Mind
  17. BadImageFormatException-试图加载格式不正确的程序(0x8007000B)
  18. PHP file_get_contents函数详解
  19. SYD88811新DTM测试
  20. Android 系统广播(大全)

热门文章

  1. python—内置函数-字符串,eval,isinstance
  2. 折半查找算法及分析(手工过程)
  3. 数据结构0类模板的使用
  4. 网址出现error.aspx?aspxerrorpath=404.htm?aspxerrorpath=的原因及解决办法转
  5. awk 多文件操作2种实现方法
  6. Tech·Ed 2009
  7. php安装dat,PHP Parsing a .dat file
  8. 人工通道会取消吗_二七政策将用于ETC?高速或将取消人工收费通道
  9. vb在服务器上新建文件夹,vb.net-如果不存在,如何在VB中创建文件夹?
  10. 努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...