bzoj 3884 上帝与集合的正确用法(递归,欧拉函数)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=3884
【题意】
求2^2^2… mod p
【思路】
设p=2^k * q+(1/0),使q为一个奇数
第二项如果是1,mod 1 为0可以忽略。
则我们求:
2^2^2… mod p
=2^k*(2^(2^2…-k) mod q)
因为q是奇数所以与2互质,根据欧拉定理:
a^phi(p) mod p=1,(a,p)=1
转化为:
2^k*(2^(2^2…mod phi(p) – k mod phi(p)))
对于前一项可以递归求解,子问题为solve(phi(p)),递归边界为p=1,此时返回0。
【代码】
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std; typedef long long ll;
const int N = 1e5+; ll pow(ll a,ll p,ll mod)
{
ll ans=;
while(p)
{
if(p&) ans=(ans*a)%mod;
a=(a*a)%mod; p>>=;
}
return ans;
}
ll phi(ll x)
{
ll ans=x;
for(int i=;i*i<=x;i++) if(x%i==)
{
ans=ans/i*(i-);
while(x%i==) x/=i;
}
if(x>) ans=ans/x*(x-);
return ans;
} int n,T,P; ll solve(ll p)
{
if(p==) return ;
int k=;
while(~p&) p>>=,k++;
ll pi=phi(p);
ll ans=solve(pi);
ans=(ans+pi-k%pi)%pi;
ans=pow(,ans,p)%p;
return ans<<k;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&P);
printf("%lld\n",solve(P));
}
return ;
}
P.S.题解抄的PoPoQQQ的,自己又叙述了一遍而已
bzoj 3884 上帝与集合的正确用法(递归,欧拉函数)的更多相关文章
- BZOJ3884 上帝与集合的正确用法(欧拉函数)
设f(n)为模n时的答案,由2k mod n=2k mod φ(n)+φ(n) mod n(并不会证),且k mod φ(n)=f(φ(n)),直接就可以得到一个递推式子.记搜一发即可. #inclu ...
- bzoj 3884 上帝与集合的正确用法 指数循环节
3884: 上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 根据一些 ...
- BZOJ 3884 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- 【数学】[BZOJ 3884] 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元” ...
- BZOJ 3884 上帝与集合的正确用法(扩展欧拉定理)
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...
- 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; ...
随机推荐
- activiti5.13 框架 数据库设计说明书
转载自:http://www.cnblogs.com/llzgzljl/p/3356108.html activiti5.13 框架 数据库设计说明书 1.结构设计 1.1. 逻辑结构设计 Ac ...
- Java API —— Calendar类
1.Calendar类概述 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段 ...
- 即时通信Spark安装和配置
spark:Cross-platform real-time collaboration client optimized for business and organizations.Spark i ...
- Codeforces Round #205 (Div. 2)
A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- hdu 4143 A Simple Problem (变形)
题目 题意:给n,求x; 直接枚举肯定超时, 把给的式子变形, (y+x)(y-x) = n; 令y-x = b, y+x = a; 枚举b, b 的范围肯定是sqrt(n), y = (a+b)/ ...
- 函数fsp_alloc_from_free_frag
/**********************************************************************//** Allocates a single free ...
- 4197: [Noi2015]寿司晚宴
状压dp. 500分解质因数的话,除了最大的质因数只需要8个质数,用二进制x储存,最大的质因数用y来储存(若没有比那8个质数大的质因数就使y=1) 用f[i][j]表示第一个人方案为i,第二个人方案为 ...
- [020] Android模拟器访问本地Web应用
本篇文章试图解决这样一个问题:如何在Android模拟器上访问本地的Web应用? 例如,在你的开发机器上启动一个Tomcat服务,接着打开电脑上的浏览器,默认情况下输入http://localhost ...
- .gitignore的使用:首次创建及事后添加无法生效.
问题:使用sourceTree做版本管理后, Xcode工程每次打开, 都会有几个xcodeworkspace之类的文件提示改动了. 如果想ignore掉, 有两种情况: 1:整个工程没有纳入版本管理 ...
- 【JS】<c:foreach>用法
<c:foreach>类似于for和foreach循环 以下是我目前见过的用法: 1.循环遍历,输出所有的元素. <c:foreach items="${list}&q ...