题意:

已知\(f(0)=1,f(n)=(n\%10)^{f(n/10)}\),求\(f(n)\mod m\)

思路:

由扩展欧拉定理可知:当\(b>=m\)时,\(a^b\equiv a^{b\%\varphi(m)+\varphi(m)}\mod m\),那么我们可以通过这个式子直接去递归求解。

在递归的时候每次给下一个的模数都是\(phi(mod)\),那么我们求出来之后,怎么知道要不要再加\(phi(m)\)?

我们可以在每次返回的时候用一个特殊的快速幂返回正确的值。然后每次特判返回值的时候都要一样:

a = mod? a % mod + mod : a

  1. ll ksm(ll a, ll b, ll mod){
  2. ll ret = 1;
  3. while(b){
  4. if(b & 1) ret = ret * a;
  5. if(ret >= mod){
  6. ret = ret % mod + mod;
  7. }
  8. a = a * a;
  9. if(a >= mod){
  10. a = a % mod + mod;
  11. }
  12. b >>= 1;
  13. }
  14. return ret;
  15. }

代码:

  1. #include<map>
  2. #include<set>
  3. #include<queue>
  4. #include<cmath>
  5. #include<stack>
  6. #include<ctime>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<string>
  10. #include<cstring>
  11. #include<sstream>
  12. #include<iostream>
  13. #include<algorithm>
  14. typedef long long ll;
  15. typedef unsigned long long ull;
  16. using namespace std;
  17. const int maxn = 1e5 + 5;
  18. const int MAXM = 3e6;
  19. const ll MOD = 998244353;
  20. const ull seed = 131;
  21. const int INF = 0x3f3f3f3f;
  22. ll euler(ll n){
  23. ll res = n, a = n;
  24. for(int i = 2; i * i <= a; i++){
  25. if(a % i == 0){
  26. res = res / i * (i - 1);
  27. while(a % i == 0) a/= i;
  28. }
  29. }
  30. if(a > 1) res = res / a * (a - 1);
  31. return res;
  32. }
  33. ll ksm(ll a, ll b, ll mod){
  34. ll ret = 1;
  35. while(b){
  36. if(b & 1) ret = ret * a;
  37. if(ret >= mod){
  38. ret = ret % mod + mod;
  39. }
  40. a = a * a;
  41. if(a >= mod){
  42. a = a % mod + mod;
  43. }
  44. b >>= 1;
  45. }
  46. return ret;
  47. }
  48. ll f(ll a, ll mod){
  49. if(a == 0) return 1 >= mod? 1 % mod + mod : 1;
  50. if(mod == 1) return a >= mod? a % mod + mod : a; //剪枝
  51. ll phm = euler(mod);
  52. ll b = f(a / 10, phm);
  53. return ksm(a % 10, b, mod);
  54. }
  55. int main(){
  56. int T;
  57. scanf("%d", &T);
  58. while(T--){
  59. ll n, m;
  60. scanf("%lld%lld", &n, &m);
  61. printf("%lld\n", f(n, m) % m); //这里要取模
  62. }
  63. return 0;
  64. }

HDU2837 Calculation(指数循环节)题解的更多相关文章

  1. hdu 2837 Calculation 指数循环节套路题

    Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU 4335 What is N?(指数循环节)题解

    题意: 询问有多少数\(n\)满足\(n^{n!}\equiv b\mod p \land\ n\in[1,M]\),数据范围:\(M\leq2^{64}-1,p\leq1e5\) 思路: 这题显然要 ...

  3. hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂

    Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  4. 指数循环节&欧拉降幂

    证明:https://www.cnblogs.com/maijing/p/5046628.html 注意使用条件(B的范围) 例题: FZU1759 HDU2837 ZOJ1674 HDU4335

  5. 指数循环节 求A的B次方模C

    phi(c)为欧拉函数, 欧拉定理 : 对于互质的正整数 a 和 n ,有 aφ(n)  ≡ 1 mod n  . A^x = A^(x % Phi(C) + Phi(C)) (mod C) (x & ...

  6. HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

    传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...

  7. HDU 1358 Period(KMP+最小循环节)题解

    思路: 这里只要注意一点,就是失配值和前后缀匹配值的区别,不懂的可以看看这里,这题因为对子串也要判定,所以用前后缀匹配值,其他的按照最小循环节做 代码: #include<iostream> ...

  8. HDU 3746 Cyclic Nacklace(KMP+最小循环节)题解

    思路: 最小循环节的解释在这里,有人证明了那么就很好计算了 之前对KMP了解不是很深啊,就很容易做错,特别是对fail的理解 注意一下这里getFail的不同含义 代码: #include<io ...

  9. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

随机推荐

  1. guava eventbus 原理+源码分析

    前言: guava提供的eventbus可以很方便的处理一对多的事件问题, 最近正好使用到了,做个小结,使用的demo网上已经很多了,不再赘述,本文主要是源码分析+使用注意点+新老版本eventbus ...

  2. 使用git上传代码到github远程仓库

    一.新建代码库注册好github登录后,首先先在网页上新建代码库. 点击右上角"+"→New repository 进入如下页面:按照要求填写完成后,点击按钮创建代码库创建成功. ...

  3. 多路复用器Select、Poll、Epoll区别梳理

    注意:本文是本人的学习总结,可能存在理解上的错误,请带着怀疑眼光看待,如果有不准确的地方欢迎指出,疑义相与析.为了叙述完整性,前面有一些前置知识,可以根据目录直接看后面的详解部分. 前置知识 用户态与 ...

  4. 详解SpringMVC

    详解SpringMVC 一.什么是MVC? ​ MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范.就是将业务逻辑.数据.显示分离的方法来组织代码. ...

  5. 实用 nginx.conf 用法大全

    服务器拒绝非GET方式请求保障安全性,因为 DELETE.POST.PUT 是可以修改数据的. Nginx 解决方案 在 nginx.conf 配置文件的网站配置区域中添加如下代码片段: 非 GET ...

  6. (007)每日SQL学习:将字符和数字分离

    with aa as ( select 'sad10' as data from dual union all select 'datf20' as data from dual union all ...

  7. Linux 中的文件属性

    文件属性 d 开头是: 目录文件.l  开头是: 符号链接(指向另一个文件,类似于瘟下的快捷方式).s 开头是: 套接字文件(sock).b 开头是: 块设备文件,二进制文件.c 开头是: 字符设备文 ...

  8. Google performance Tools (gperftools) 使用心得

    Google performance Tools (gperftools) 使用心得 gperftools是google开发的一款非常实用的工具集,主要包括:性能优异的malloc free内存分配器 ...

  9. UI自动化测试实战

    前言 前面我们已经搭建好了wordpress网站,如果需要查看运行效果可以看我前面的搭建文章,下面我们来进行自动化测试的练习. 示例 首先我们测试自动登陆 import unittest from s ...

  10. COGS 307 模拟退火

    307. [HAOI2006] 均分数据 ★★   输入文件:data.in   输出文件:data.out   简单对比时间限制:3 s   内存限制:128 MB [问题描述] 已知N个正整数:A ...