3884: 上帝与集合的正确用法

Time Limit: 5 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

 
根据一些书上的记载,上帝的一次失败的创世经历是这样的:
第一天, 上帝创造了一个世界的基本元素,称做“元”。
第二天, 上帝创造了一个新的元素,称作“α”。“α”被定义为“元”构成的集合。容易发现,一共有两种不同的“α”。
第三天, 上帝又创造了一个新的元素,称作“β”。“β”被定义为“α”构成的集合。容易发现,一共有四种不同的“β”。
第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合。显然,一共会有16种不同的“γ”。
如果按照这样下去,上帝创造的第四种元素将会有65536种,第五种元素将会有2^65536种。这将会是一个天文数字。
然而,上帝并没有预料到元素种类数的增长是如此的迅速。他想要让世界的元素丰富起来,因此,日复一日,年复一年,他重复地创造着新的元素……
然而不久,当上帝创造出最后一种元素“θ”时,他发现这世界的元素实在是太多了,以致于世界的容量不足,无法承受。因此在这一天,上帝毁灭了世界。
至今,上帝仍记得那次失败的创世经历,现在他想问问你,他最后一次创造的元素“θ”一共有多少种?
上帝觉得这个数字可能过于巨大而无法表示出来,因此你只需要回答这个数对p取模后的值即可。
你可以认为上帝从“α”到“θ”一共创造了10^9次元素,或10^18次,或者干脆∞次。
 
一句话题意:

Input

 
接下来T行,每行一个正整数p,代表你需要取模的值

Output

T行,每行一个正整数,为答案对p取模后的值

Sample Input

3
2
3
6

Sample Output

0
1
4

HINT

对于100%的数据,T<=1000,p<=10^7

我的思路:因为无限次数,所以次方一定大于模;指数循环节;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int N=1e5+,M=1e6+,mod=1e9+,inf=1e9+;
  5. ll phi(ll n)
  6. {
  7. ll i,rea=n;
  8. for(i=;i*i<=n;i++)
  9. {
  10. if(n%i==)
  11. {
  12. rea=rea-rea/i;
  13. while(n%i==) n/=i;
  14. }
  15. }
  16. if(n>)
  17. rea=rea-rea/n;
  18. return rea;
  19. }
  20. ll quickpow(ll x,ll y,ll z)
  21. {
  22. ll ans=;
  23. while(y)
  24. {
  25. if(y&)
  26. ans*=x,ans%=z;
  27. x*=x;
  28. x%=z;
  29. y>>=;
  30. }
  31. return ans;
  32. }
  33. ll solve(ll k,ll mod)
  34. {
  35. if(mod==) return ;
  36. ll tmp=phi(mod);
  37. ll up=solve(k,tmp);
  38. ll ans=quickpow(k,up+tmp,mod);
  39. return ans;
  40. }
  41. int main()
  42. {
  43. ll x,p,i,t;
  44. int T;
  45. scanf("%d",&T);
  46. while(T--)
  47. {
  48. scanf("%lld",&p);
  49. printf("%lld\n",solve(2ll,p)%p);
  50. }
  51. return ;
  52. }

popoqqq:http://blog.csdn.net/popoqqq/article/details/43951401

int solve(int p)

{
if(p==1)return 0;
int k=0;
while(~p&1)p>>=1,k++;
int pp=phi[p],res=solve(pp);
res=(res+pp-k%pp)%pp;
res=pow(2,res,p)%p;
return res<<k;
}
再附一神犇代码自己抠的
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<iostream>
  5. #include<sstream>
  6. #include<algorithm>
  7. #include<utility>
  8. #include<vector>
  9. #include<set>
  10. #include<map>
  11. #include<queue>
  12. #include<cmath>
  13. #include<iterator>
  14. #include<stack>
  15. using namespace std;
  16. const int INF=1e9+;
  17. const double eps=1e-;
  18. const int N=1e7+;
  19. const int M=;
  20. typedef long long ll;
  21. ll phi(ll n)
  22. {
  23. ll i,rea=n;
  24. for(i=;i*i<=n;i++)
  25. {
  26. if(n%i==)
  27. {
  28. rea=rea-rea/i;
  29. while(n%i==) n/=i;
  30. }
  31. }
  32. if(n>)
  33. rea=rea-rea/n;
  34. return rea;
  35. }
  36. ll Pow(ll a,ll n,ll mod)
  37. {
  38. ll ans=;
  39. while(n)
  40. {
  41. if(n&)
  42. {
  43. ans=ans*a%mod;
  44. }
  45. a=a*a%mod;
  46. n>>=;
  47. }
  48. if(ans==) ans+=mod;
  49. return ans;
  50. }
  51. ll solve(ll k,ll mod)
  52. {
  53. if(mod==) return mod;
  54. ll tmp=phi(mod);
  55. ll up=solve(k,tmp);
  56. ll ans=Pow(k,up,mod);
  57. return ans;
  58. }
  59. int main()
  60. {
  61. ll n,m,p;
  62. int T;
  63. scanf("%d",&T);
  64. while(T--)
  65. {
  66. scanf("%lld",&p);
  67. ll ans=solve(2ll,p);
  68. printf("%lld\n",ans%p);
  69. }
  70. return ;
  71. }

bzoj 3884 上帝与集合的正确用法 指数循环节的更多相关文章

  1. BZOJ 3884 上帝与集合的正确用法

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

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

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

  3. BZOJ 3884 上帝与集合的正确用法(扩展欧拉定理)

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

  4. bzoj 3884 上帝与集合的正确用法(递归,欧拉函数)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3884 [题意] 求2^2^2… mod p [思路] 设p=2^k * q+(1/0) ...

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

    PoPoQQQ大爷太神了 只要用欧拉定理递归下去就好了.... 然而还是有些细节没考虑好: $(P,2) \neq 1$时分解$P=2^k*q$的形式,然后变成$2^k(2^{(2^{2^{...}} ...

  6. BZOJ.3884.上帝与集合的正确用法(扩展欧拉定理)

    \(Description\) 给定p, \(Solution\) 欧拉定理:\(若(a,p)=1\),则\(a^b\equiv a^{b\%\varphi(p)}(mod\ p)\). 扩展欧拉定理 ...

  7. 解题:BZOJ 3884 上帝与集合的正确用法

    题面 好久以前写的,发现自己居然一直没有写题解=.= 扩展欧拉定理:在$b>φ(p)$时有$a^b \equiv a^{b\%φ(p)+φ(p)}(mod$ $p)$ 然后每次递归那个$a^{b ...

  8. BZOJ 3884: 上帝与集合的正确用法 扩展欧拉定理 + 快速幂

    Code: #include<bits/stdc++.h> #define maxn 10000004 #define ll long long using namespace std; ...

  9. BZOJ 3884 上帝与集合的正确用法题解

    一道智慧题 其实解这题需要用到扩展欧拉定理, 有了上面的公式,我们不难看出此题的解法. 设b为2^2^2^2^2.....显然,b要比φ(p)要大,所以可以直接套公式 modp时的答案 ans(p)= ...

随机推荐

  1. Caused by: java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected

    需要注意的是ComponentScan 不能扫描 org.springframework 否则会报错,要扫描指定的package才行

  2. c# + Sql server 事务处理

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便 ...

  3. delphi xe-system.json

    Delphi XE10有一个对JSON处理的单元,在你需要使用JSON的单元里面引入"System.json",随后你就可以用Delphi自己的json处理类了. 普通解析 实例1 ...

  4. 超哥带你学网络编程部分blog

    https://www.cnblogs.com/clschao/articles/9593164.html  网络编程 https://www.cnblogs.com/clschao/articles ...

  5. AutoArchive settings explained

    AutoArchive settings explained Applies To: Outlook 2010 More... Less AutoArchive helps manage the sp ...

  6. showslow / YSlow for PhantomJS/slimerjs(gecko)/phantomas

    http://yslow.org/phantomjs/ http://www.bstester.com/2015/12/front-end-performance-using-jenkinsphant ...

  7. Java算法之“兔子问题”

    package wulj; /** * Java算法之“兔子问题”: * 有一只兔子,从出生后第3个月起每个月都生只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多 ...

  8. Java 语言基础(一)

    大多数编程语言都包括以下基本内容: 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 学习语言最重要的两点: 该语言基础的表现形式是什么 这些东西什么时候使用 关键字 在程序语言中有特殊含义 ...

  9. Java 面向对象之构造函数和 this 关键字

    构造函数 this 关键字 1. 构造函数 class Person { private String name; private int age; // 定义一个 Person 类的构造函数 Per ...

  10. DRF(5) - 频率组件、url注册器、响应器、分页器

    一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...