【数学】[BZOJ 3884] 上帝与集合的正确用法
Description

Input
Output
第一感觉:不可做- -。
但是p与2不一定互质,所以我们可以化成下面的形式。
设f(p)=。
那么我们可以得到一个不断递推的公式f(p)=2^(f(phi(p))+phi(p))%p.边界:p=1,f(p)=0.
证明算法复杂度如下:
若p为偶数,则ϕ(p)≤p2;
若p为奇数,则p存在一个奇数因子q,使得ϕ(p)存在一个偶数因子(q−1),转化为偶数的情况。
由此可知,ϕ(ϕ(...ϕ(p)))的计算经过O(logp)次的迭代就到了1,所以f(p)的计算是O(p√logp)的。(部分思(dai)想(ma)选自http://blog.csdn.net/skywalkert/article/details/43955611)
第二种方法的代码。。
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #define ll long long
- using namespace std;
- int mod,num[];
- int Qvod(int k,int mo)
- {
- ll ans=,x=;
- while(k!=)
- {
- if(k&)ans=ans*x%mo;
- x=x*x%mo;
- k>>=;
- }
- return ans;
- }
- int phi(int x)
- {
- int ans=x,aa=x;
- for(int i=;i<=sqrt(ans);i++)if(x%i==){
- while(x%i==)x/=i;
- aa=(ll)aa*(i-)/i;
- }
- if(x!=)aa=(ll)aa*(x-)/x;
- return aa;
- }
- int f(int x)
- {
- if(x==)return ;
- if(num[x])
- return num[x];
- int sb=phi(x);
- num[x]=Qvod(f(sb)+sb,x);
- return num[x];
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d",&mod);
- printf("%d\n",f(mod));
- }
- return ;
- }
【数学】[BZOJ 3884] 上帝与集合的正确用法的更多相关文章
- bzoj 3884 上帝与集合的正确用法 指数循环节
3884: 上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 根据一些 ...
- BZOJ 3884 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- BZOJ 3884 上帝与集合的正确用法(扩展欧拉定理)
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...
- bzoj 3884 上帝与集合的正确用法(递归,欧拉函数)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3884 [题意] 求2^2^2… mod p [思路] 设p=2^k * q+(1/0) ...
- BZOJ 3884: 上帝与集合的正确用法 [欧拉降幂]
PoPoQQQ大爷太神了 只要用欧拉定理递归下去就好了.... 然而还是有些细节没考虑好: $(P,2) \neq 1$时分解$P=2^k*q$的形式,然后变成$2^k(2^{(2^{2^{...}} ...
- BZOJ.3884.上帝与集合的正确用法(扩展欧拉定理)
\(Description\) 给定p, \(Solution\) 欧拉定理:\(若(a,p)=1\),则\(a^b\equiv a^{b\%\varphi(p)}(mod\ p)\). 扩展欧拉定理 ...
- 解题:BZOJ 3884 上帝与集合的正确用法
题面 好久以前写的,发现自己居然一直没有写题解=.= 扩展欧拉定理:在$b>φ(p)$时有$a^b \equiv a^{b\%φ(p)+φ(p)}(mod$ $p)$ 然后每次递归那个$a^{b ...
- BZOJ 3884: 上帝与集合的正确用法 扩展欧拉定理 + 快速幂
Code: #include<bits/stdc++.h> #define maxn 10000004 #define ll long long using namespace std; ...
- BZOJ 3884 上帝与集合的正确用法题解
一道智慧题 其实解这题需要用到扩展欧拉定理, 有了上面的公式,我们不难看出此题的解法. 设b为2^2^2^2^2.....显然,b要比φ(p)要大,所以可以直接套公式 modp时的答案 ans(p)= ...
随机推荐
- 在c#中使用log4net
1.从log4net官网下载最新的log4net.dll 2.设置配置文件在app.config <?xml version="1.0"?> <configura ...
- Yii zii.widgets.grid 隐藏列 方便js获取隐藏值
array( 'name' => $data->is_audit, 'value' => '$data->is_audit', 'headerHtmlOptions' => ...
- java匹配中文汉字的正则表达式
正则表达式匹配中文先要了解中文的编码 代码如下 复制代码 [u4E00-u9FA5]汉字?[uFE30-uFFA0]全角字符 [u4E00-u9FA5]汉字?[uFE30-uFFA0]全角字符 匹配中 ...
- Android Timer用法
Android考虑到线程安全问题,不允许在线程中执行UI线程,在Android中,有一个类:android.os.Handler,这个可以实现各处线程间的消息传递.先看段代码,这个实例化了一个Hand ...
- Oracle中NVARCHAR2字符集不匹配问题
Oracle中在做字符匹配时 遇到 NVARCHAR2 类型时报错,提示 字符集不匹配. 对使用 NVARCHAR2 的地方,需要对字段进行字符转换,加上 to_char(nvarchar2 字段) ...
- iOS 拷贝、剪切和粘贴理论基础(转)
简介 在iPhone OS 3.0之后,用户可以在一个应用程序上拷贝文本.图像.或其它数据,然后粘贴到当前或其它应用程序的不同位置上.比如,您可以从某个电子邮件中拷贝一个地址,然后粘贴到Contact ...
- C#中 多线程执行含有返回值的函数
C# 中,传统的多线程并不支持多线程执行含有返回结果的函数.虽然可以通过制作外壳类来使得返回结果得以保留,但如果一定时间内函数未执行完,简单的外壳类可能就无法满足需求了. class netHelpe ...
- Android的selector,背景选择器
原文地址 http://android.blog.51cto.com/268543/564581 首先android的selector是在drawable/xxx.xml中配置的,相关图片放在同目录下 ...
- Oracle创建新用户
1.以DBA身份登录 $ sqlplus sys/eastcom@ORCL as sysdba(在命令窗口下) 也可以使用PL/SQL 2.创建临时表空间 create temporary table ...
- 随机森林之Bagging法
摘要:在随机森林介绍中提到了Bagging方法,这里就具体的学习下bagging方法. Bagging方法是一个统计重采样的技术,它的基础是Bootstrap.基本思想是:利用Bootstrap方法重 ...