求$$2^{2^{2^{2^{…}}}} mod n$$的值,其中n有1e7。

老实说这题挺有趣的,关键是怎么化掉指数,由于是取模意义下的无限个指数,所以使用欧拉定理一定是可以把指数变为不大于$\varphi(n)$的,但是我们连上一层指数的值都不知道,怎么化阿...

考虑同余定理,把n变为$n=2^k·s$的形式,然后$2^k$先提取出来,这样每向一层模数会减少,最后到1这样最后一层可以得到0的值了,回溯时计算完一层的指数时再把$2^k$乘回去就好了

  1. /** @Date : 2017-09-11 21:22:36
  2. * @FileName: bzoj 3884 欧拉降幂.cpp
  3. * @Platform: Windows
  4. * @Author : Lweleth (SoungEarlf@gmail.com)
  5. * @Link : https://github.com/
  6. * @Version : $Id$
  7. */
  8. #include <bits/stdc++.h>
  9. #define LL long long
  10. #define PII pair<int ,int>
  11. #define MP(x, y) make_pair((x),(y))
  12. #define fi first
  13. #define se second
  14. #define PB(x) push_back((x))
  15. #define MMG(x) memset((x), -1,sizeof(x))
  16. #define MMF(x) memset((x),0,sizeof(x))
  17. #define MMI(x) memset((x), INF, sizeof(x))
  18. using namespace std;
  19.  
  20. const int INF = 0x3f3f3f3f;
  21. const int N = 1e7+20;
  22. const double eps = 1e-8;
  23.  
  24. LL fpow(LL a, LL n, LL mod)
  25. {
  26. LL res = 1;
  27. while(n)
  28. {
  29. if(n & 1)
  30. res = (res * a % mod + mod) %mod;
  31. a = (a * a % mod + mod ) % mod;
  32. n >>= 1;
  33. }
  34. return res;
  35. }
  36.  
  37. int pri[N];
  38. int phi[N];
  39. int c = 0;
  40. void prime()
  41. {
  42. MMF(phi);
  43. phi[1] = 1;
  44. for(int i = 2; i < N; i++)
  45. {
  46. if(!phi[i])
  47. pri[c++] = i, phi[i] = i - 1;
  48. for(int j = 0; j < c && i * pri[j] < N; j++)
  49. {
  50. phi[i * pri[j]] = 1;
  51. if(i % pri[j] == 0)//是倍数i=kp, phi(kpp)=kpp*[phi(kp)/kp]=p*phi(kp)
  52. {
  53. phi[i * pri[j]] = phi[i] * pri[j];
  54. break;
  55. }
  56. else //积性函数性质 (i, p) = 1, phi(ip)=phi(i)*phi(p)
  57. phi[i * pri[j]] = phi[i] * (pri[j] - 1);
  58. }
  59. }
  60. }
  61.  
  62. int get_phi(int x)
  63. {
  64. int phi = x;
  65. for(int i = 2; i * i <= x; i++)
  66. {
  67. if(x % i == 0)
  68. {
  69. while(x % i==0)
  70. x /= i;
  71. phi = phi / i * (i - 1);
  72. }
  73. }
  74. if(x > 2)
  75. phi = phi / x * (x - 1);
  76. return phi;
  77. }
  78.  
  79. int dfs(int p)
  80. {
  81. if(p == 1)
  82. return 0;
  83. int k = 0;
  84. while(p % 2 == 0)
  85. p>>=1, k++;
  86. int s = p;
  87. int phis = get_phi(s);/*phi[s];*/
  88. int nxe = dfs(phis);//模数向上递归
  89. nxe = (nxe - k % phis + phis) % phis;//欧拉降幂
  90. nxe = fpow(2, nxe, s) % s;
  91. return nxe << k;
  92. }
  93. int main()
  94. {
  95. int T;
  96. //prime();
  97. cin >> T;
  98. while(T--)
  99. {
  100. int mod;
  101. scanf("%d", &mod);
  102. printf("%d\n", dfs(mod));
  103. }
  104. return 0;
  105. }

bzoj 3884 欧拉定理的更多相关文章

  1. BZOJ 3884 欧拉定理 无穷幂取模

    详见PoPoQQQ的博客.. #include <iostream> #include <cstring> #include <cstdio> #include & ...

  2. [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法

    看看我们机房某畸形写的题解:http://blog.csdn.net/sinat_27410769/article/details/46754209 此题为popoQQQ神犇所出,在此orz #inc ...

  3. BZOJ 3884 拓展欧拉定理

    3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4142  Solved: 1907[Submit][Status][D ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Alpha 冲刺5

    队名:日不落战队 安琪(队长) 今天完成的任务 组织第五次站立式会议(半冲刺总结交流会). 完成草稿箱前端界面. 明天的计划 回收站前端界面. 尝试去调用数据. 还剩下的任务 信息修改前端界面. 遇到 ...

  2. 转 使用Docker部署 spring-boot maven应用

    转自:https://blog.csdn.net/u011699931/article/details/70226504/ 使用Docker部署 spring-boot maven应用 部署过程分为以 ...

  3. jdbc 2.0

    1.Statement接口不能接受参数 2.PreparedStatement接口在运行时接受输入参数 3.CallableStatement接口也可以接受运行时输入参数,当想要访问数据库存储过程时使 ...

  4. 博客搬家 --- CSDN

    博客园好久没维护了,搬家吧 欢迎移步到新博客

  5. js & enter

    js & enter keycode function (e) { if (e.which === 13 || e.keyCode === 13) { //code to execute he ...

  6. python获取toast 验证

    appium版本 1.6.3  desired_caps['automationName']='uiautomator2'    def _find_toast(self,message,timeou ...

  7. Vue父组件与子组件传递事件/调用事件

    1.Vue父组件向子组件传递事件/调用事件 <div id="app"> <hello list="list" ref="child ...

  8. 【EF】Entity Framework Core 软删除与查询过滤器

    本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...

  9. 【EF】EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  10. hdu3507 Print Article(斜率优化入门)(pascal)

    Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...