http://acm.hdu.edu.cn/showproblem.php?pid=4291

凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙:

g(g(g(n))) mod 109 + 7  最外层MOD=1e9+7  能够算出g(g(n))的循环节222222224。进而算出g(n)的循环节183120LL。然后由内而外计算就可以

凝视掉的是求循环节的代码

  1. //#pragma comment(linker, "/STACK:102400000,102400000")
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <string>
  6. #include <iostream>
  7. #include <iomanip>
  8. #include <cmath>
  9. #include <map>
  10. #include <set>
  11. #include <queue>
  12. using namespace std;
  13.  
  14. #define ls(rt) rt*2
  15. #define rs(rt) rt*2+1
  16. #define ll long long
  17. #define ull unsigned long long
  18. #define rep(i,s,e) for(int i=s;i<e;i++)
  19. #define repe(i,s,e) for(int i=s;i<=e;i++)
  20. #define CL(a,b) memset(a,b,sizeof(a))
  21. #define IN(s) freopen(s,"r",stdin)
  22. #define OUT(s) freopen(s,"w",stdout)
  23. const ll ll_INF = ((ull)(-1))>>1;
  24. const double EPS = 1e-8;
  25. const double pi = acos(-1.0);
  26. const int INF = 100000000;
  27. const ll MOD[3] = {183120LL,222222224LL,1000000007LL};
  28. const int N = 2;
  29.  
  30. struct Matrix{
  31. ll m[N][N];
  32. //int sz;//矩阵的大小
  33. };
  34.  
  35. Matrix I= {3LL,1LL,//要幂乘的矩阵
  36. 1LL,0LL,
  37. };
  38. Matrix unin={1LL,0LL,//单位矩阵
  39. 0LL,1LL,
  40. };
  41. Matrix matrixmul(Matrix a,Matrix b,long long mod)//矩阵a乘矩阵b
  42. {
  43. Matrix c;
  44. for(int i=0; i<N; i++)
  45. for(int j=0; j<N; j++)
  46. {
  47. c.m[i][j]=0LL;
  48. for(int k=0; k<N; k++)
  49. c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
  50. c.m[i][j]%=mod;
  51. }
  52. return c;
  53. }
  54. Matrix quickpow(long long n,long long mod)
  55. {
  56. Matrix m=I,b=unin;//求矩阵I的n阶矩阵
  57. while(n>=1)
  58. {
  59. if(n&1)
  60. b=matrixmul(b,m,mod);
  61. n=n>>1;
  62. m=matrixmul(m,m,mod);
  63. }
  64. return b;
  65. }
  66.  
  67. ll solve(ll n)
  68. {
  69. ll ans;
  70. Matrix ret;
  71. ret.m[0][0]=n;
  72. for(int i=0;i<3;i++)
  73. {
  74. if(ret.m[0][0]!=0 && ret.m[0][0]!=1)ret=quickpow(ret.m[0][0]-1,MOD[i]);
  75. }
  76.  
  77. return ret.m[0][0];
  78. }
  79.  
  80. int main()
  81. {
  82. //precal();
  83. ll n;
  84. while(~scanf("%I64d",&n))
  85. {
  86. if(n==0){puts("0");continue;}
  87. if(n==1){puts("1");continue;}
  88. //printf("%I64d\n",solve(n));
  89. cout << solve(n)%1000000007LL << endl;
  90. }
  91. return 0;
  92. }

hdu 4291 矩阵幂  循环节

hdu 4291 矩阵幂 循环节的更多相关文章

  1. hdu 4291(矩阵+暴力求循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4291 思路:首先保留求出循环节,然后就是矩阵求幂了. #include<iostream> ...

  2. HDU——4291A Short problem(矩阵快速幂+循环节)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. HDU 5690——All X——————【快速幂 | 循环节】

    All X Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  4. hdu 4794 FIb求循环节

    很容易看出来这道题是求模n意义下fib数列的最小循环节 对于fib数列的最小循环节的求法,我们可以这样: 1.令n=p1^m1 * p2^m2 * p3^m3…… 2.分别计算fib数列在模p1^m1 ...

  5. HDU 2157 矩阵幂orDP

    How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. Cyclic Nacklace - HDU 3746(next求循环节)

    题目大意:给你一些串,问如果想让这个串里面的循环节至少循环两次,需要添加几个字符(只能在最前面或者最后面添加).比如ababc 需要添加5个就是添加ababc. 分析:其实字符串的长度len-next ...

  7. HDU 6740 kmp最小循环节

    题意:给一个无线循环小数的前几位,给n,m 选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b 使得n*a-m*b最大 样例: 2 1 12.1212 输出 6 选择2,2*1-1*1=1 ...

  8. hdu 1358 Period 最小循环节

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 分析:已知字符串,求其由最小循环节构成的前缀字符串. /*Period Time Limit: ...

  9. hdu 3746 kmp求循环节

    题意就是将所给的字符串变成多个完整的循环(至少两个),然后给出最少需要添加的字符数.

随机推荐

  1. RSA js加密 java解密

    1. 首先你要拥有一对公钥.私钥: ``` pubKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1gr+rIfYlaNUNLiFsK/Kn ...

  2. android手机web网站拨打电话几种方式

    1. <input name="phone" format="*m" value="13"/> <do type=&quo ...

  3. 迅为工业级arm开发板i.MX6DL开发板软件硬件全开源

    i.MX6是基于ARM Cortex™-A9架构的高扩展性多核系列应用处理器,促进了如高稳定性工业平板电脑.差异化智能本.前装车载中控系统和超高清电子书阅读器等新一代应用的发展.强劲的3D图形加速引擎 ...

  4. fabric的安装

    https://blog.csdn.net/lepton126/article/details/79148027

  5. Asp.Net MVC中Controller、Action、View是如何激活调用的

    上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...

  6. Python 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

  7. [Python3网络爬虫开发实战] 1.8.2-Scrapy的安装

    Scrapy是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有Twisted 14.0.lxml 3.4和pyOpenSSL 0.14.在不同的平台环境下,它所依赖的库也各不相同,所以在安装 ...

  8. 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0

      版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...

  9. pandas的合并、连接、去重、替换

    import pandas as pd import numpy as np # merge合并 ,类似于Excel中的vlookup df1 = pd.DataFrame({'key': ['K0' ...

  10. 洛谷 1197 [JSOI2008]星球大战

    [题解] 把询问离线,倒着加点,并查集维护连通性即可. #include<cstdio> #include<cstring> #include<algorithm> ...