【BZOJ3884】上帝与集合的正确用法
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】上帝与集合的正确用法相关推荐
- BZOJ-3884 上帝与集合的正确用法 欧拉定理
再次仰望高端玩家Po姐 3884: 上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 772 Solved: 361 [Submit] ...
- [题解]bzoj3884 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- BZOJ3884 上帝与集合的正确用法 (欧拉定理)
根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作"α". ...
- bzoj3884上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- bzoj3884 上帝与集合的正确用法
题意:求2^2^2^2^2.......^2%p的值,T组询问. 欧拉降幂多用几次就好了. 顺便试了下fwrite输出优化 ,效果显著. #include<cstring> #includ ...
- BZOJ3884上帝与集合的正确用法-欧拉函数
刚开始我想的是欧拉降幂,可是觉得复杂度还是挺高的就去找了一下题解. 思路大方向没有问题,仍然是使用欧拉函数降低指数然后递归处理.但是不是简单的使用欧拉降幂而是应该对模数p稍微处理一下.因为底数已经确定 ...
- BZOJ3884 上帝与集合的正确用法 【欧拉定理】
题目 对于100%的数据,T<=1000,p<=10^7 题解 来捉这道神题 欧拉定理的一般形式: \[a^{m} \equiv a^{m \mod \varphi(p) + [m \ge ...
- bzoj 3884: 上帝与集合的正确用法(欧拉函数)
3884: 上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2574 Solved: 1151 [Submit][Status] ...
- 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理
题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作"α&quo ...
- 上帝与集合的正确用法(bzoj3884)
题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作"α&quo ...
最新文章
- 【js】callback时代的变更
- 转转转![Spring MVC] - 500/404错误处理-SimpleMappingExceptionResolver
- Ansi与Unicode及慎用W2A等
- MySQL - 体系结构初探
- SDUT 2133 数据结构实验之栈三:后缀式求值
- Java精确到毫秒获取时间的三种方法,以及适用场景
- EFK 配置geo-ip落地实践
- ios图片剪切之圆形头像
- Mac上搭建Go语言环境及第一个hello.go程序
- 基于java的员工绩效考核管理系统
- 远程访问 Sql Server Express
- 插补c语言程序,直线插补C语言程序.doc
- 微积分基本公式-牛顿莱布尼兹公式
- 186.MultiAutoCompleteTextView
- 32位系统支持多大内存 Windows32位/64位系统最大支持内存详解
- 无数个骂娘的故事告诉你,千万别做技术合伙人
- 用 BOX-COX 变换进行数据正态性处理
- 2021年NCIS医疗质量管理控制情况调查表病案首页上传
- MySQL通过分组计算百分比
- Unity游戏配置存储方案
热门文章
- Microsoft Edge 81 稳定版发布
- 微软 Powertoys 推出新的实用程序,自定义键盘快捷管理
- 微软开源新字体 Cascadia Code,与 Terminal 一起开发
- ckeditor ——在图片上传中上传其他文件(word等)
- Java web 应用全局变量_将properties文件的配置设置为整个Web应用的全局变量。
- java servlet post取值_Java servlet无法获得POST参数
- java properties $_Java读取Properties文件的六种方法
- MVVM基本基础(2)
- 全国二级c语言考试题型,2016年电大 -全国计算机二级c语言考试题型及考试重点.doc...
- android studio spellchecker,Exclude files from Android Studio lint spell checker