Description

  
  一句话题意,给定\(p\)作为模数:
  

  
  \(p\le 10^7\),数据组数\(T\le1000\)。
  
  
  

Solution

  
  看到就弃疗了,再见......
  
  将模数\(p\)拆分成\(p=q2^k\),其中\(q\)为一个奇数。那么:
  
  
\[ \begin{aligned} 2^{2^{2...}}mod\; p&=2^k(2^{2^{2..}-k}mod\;q)\\ &=2^k(2^{(2^{2..}-k)mod\;\varphi(q)}mod\;q) \end{aligned} \]
  考虑递归计算\((2^{2...}-k)\)的\(2^{2...}\),只不过模数由\(p\)变成\(\varphi(q)\)。当模数\(p\)变成1的时候,我们就遇到了边界——不管里面式子如何,模1都是0,直接返回0即可。考虑递归的层数:除了第一次调用的\(p\)可能是奇数之外,往下递归的\(p\)几乎都是偶数(\(\varphi(x),x\ge3\)都是偶数),\(\varphi(q)\)相对于\(p\)大概会减少一倍。直到\(p=1\)时,层数不会太多,dalao说是\(O(log^2p\))。
  
  所以就直接递归计算了。实现上,如果先用线性筛筛出所有的\(\varphi\),太慢。每次调用\(\varphi\)时直接\(O(\sqrt n)\)计算反而更加快。这两种方法,是稳定300ms和6ms的差距......
  
  
  

Code

  

#include <cstdio>
using namespace std;
const int S=10000001;
inline int ksm(int x,int y,int MOD){int res=1;for(;y;x=1LL*x*x%MOD,y>>=1)if(y&1) res=1LL*res*x%MOD;return res;
}
int getPhi(int x){int res=x;for(int i=2;i*i<=x;i++){if(!(x%i)) res-=res/i;while(!(x%i)) x/=i;}if(x!=1) res-=res/x;return res;
}
int calc(int p){if(p==1) return 0;int k=0,q=p;while(!(q&1)) k++,q>>=1;int phiq=getPhi(q);int mi=(calc(phiq)-k)%phiq;if(mi<0) mi+=phiq;  return 1LL*ksm(2,mi,q)*ksm(2,k,p)%p;
}
int main(){int T,p;scanf("%d",&T);while(T--){scanf("%d",&p);printf("%d\n",calc(p));}return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/9210601.html

【BZOJ3884】上帝与集合的正确用法相关推荐

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

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

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

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

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

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

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

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

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

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

  6. BZOJ3884上帝与集合的正确用法-欧拉函数

    刚开始我想的是欧拉降幂,可是觉得复杂度还是挺高的就去找了一下题解. 思路大方向没有问题,仍然是使用欧拉函数降低指数然后递归处理.但是不是简单的使用欧拉降幂而是应该对模数p稍微处理一下.因为底数已经确定 ...

  7. BZOJ3884 上帝与集合的正确用法 【欧拉定理】

    题目 对于100%的数据,T<=1000,p<=10^7 题解 来捉这道神题 欧拉定理的一般形式: \[a^{m} \equiv a^{m \mod \varphi(p) + [m \ge ...

  8. bzoj 3884: 上帝与集合的正确用法(欧拉函数)

    3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2574  Solved: 1151 [Submit][Status] ...

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

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

  10. 上帝与集合的正确用法(bzoj3884)

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

最新文章

  1. 【js】callback时代的变更
  2. 转转转![Spring MVC] - 500/404错误处理-SimpleMappingExceptionResolver
  3. Ansi与Unicode及慎用W2A等
  4. MySQL - 体系结构初探
  5. SDUT 2133 数据结构实验之栈三:后缀式求值
  6. Java精确到毫秒获取时间的三种方法,以及适用场景
  7. EFK 配置geo-ip落地实践
  8. ios图片剪切之圆形头像
  9. Mac上搭建Go语言环境及第一个hello.go程序
  10. 基于java的员工绩效考核管理系统
  11. 远程访问 Sql Server Express
  12. 插补c语言程序,直线插补C语言程序.doc
  13. 微积分基本公式-牛顿莱布尼兹公式
  14. 186.MultiAutoCompleteTextView
  15. 32位系统支持多大内存 Windows32位/64位系统最大支持内存详解
  16. 无数个骂娘的故事告诉你,千万别做技术合伙人
  17. 用 BOX-COX 变换进行数据正态性处理
  18. 2021年NCIS医疗质量管理控制情况调查表病案首页上传
  19. MySQL通过分组计算百分比
  20. Unity游戏配置存储方案

热门文章

  1. Microsoft Edge 81 稳定版发布
  2. 微软 Powertoys 推出新的实用程序,自定义键盘快捷管理
  3. 微软开源新字体 Cascadia Code,与 Terminal 一起开发
  4. ckeditor ——在图片上传中上传其他文件(word等)
  5. Java web 应用全局变量_将properties文件的配置设置为整个Web应用的全局变量。
  6. java servlet post取值_Java servlet无法获得POST参数
  7. java properties $_Java读取Properties文件的六种方法
  8. MVVM基本基础(2)
  9. 全国二级c语言考试题型,2016年电大 -全国计算机二级c语言考试题型及考试重点.doc...
  10. android studio spellchecker,Exclude files from Android Studio lint spell checker