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

题意:给定x    求解

思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = F[n-1] + F[n-2] ;

同时可以看出   和 是 一元二次方程的两根, a  = 1, b = -1 又是之后递推式的系数;

同理这里需要构造出两根为 ,这时 a = 1, b = –10 得 F[n] = 10F[n-1] – F[n-2]; (当然可以直接打表递推出关系式)

如果不管指数,看成是一个   这道题将变成 hdu 2256 Problem of Precision

之后需要知道如何对指数 进行取模简化,问题是具体Mod 多少?

套路是mod (M-1)*(M+1) ,具体证明详见:http://blog.csdn.net/acdreamers/article/details/25616461

到这里指数取模之后,之后跑矩阵快速幂即可;

细节: 前面矩阵快速幂原本只是跑指数-1次,正好把1抵消了;

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  5. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  6. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  7. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  8. #define MS0(a) memset(a,0,sizeof(a))
  9. #define MS1(a) memset(a,-1,sizeof(a))
  10. #define MSi(a) memset(a,0x3f,sizeof(a))
  11. #define pb push_back
  12. #define MK make_pair
  13. #define A first
  14. #define B second
  15. #define clear0 (0xFFFFFFFE)
  16. #define inf 0x3f3f3f3f
  17. #define eps 1e-8
  18. #define zero(x) (((x)>0?(x):-(x))<eps)
  19. #define bitnum(a) __builtin_popcount(a)
  20. #define lowbit(x) (x&(-x))
  21. #define K(x) ((x)*(x))
  22. typedef pair<int,int> PII;
  23. typedef long long ll;
  24. typedef unsigned int uint;
  25. typedef unsigned long long ull;
  26. template<typename T>
  27. void read1(T &m)
  28. {
  29. T x = ,f = ;char ch = getchar();
  30. while(ch <'' || ch >''){ if(ch == '-') f = -;ch=getchar(); }
  31. while(ch >= '' && ch <= ''){ x = x* + ch - '';ch = getchar(); }
  32. m = x*f;
  33. }
  34. template<typename T>
  35. void read2(T &a,T &b){read1(a);read1(b);}
  36. template<typename T>
  37. void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
  38. template<typename T>
  39. void out(T a)
  40. {
  41. if(a>) out(a/);
  42. putchar(a%+'');
  43. }
  44. inline ll gcd(ll a,ll b){ return b == ? a: gcd(b,a%b); }
  45. inline ll lcm(ll a,ll b){ return a/gcd(a,b)*b; }
  46. template<class T1, class T2> inline void gmax(T1& a, T2 b){ if(a < b) a = b;}
  47. template<class T1, class T2> inline void gmin(T1& a, T2 b){ if(a > b) a = b;}
  48. int mod;
  49. struct Matrix{
  50. int row, col;
  51. ll m[][];
  52. Matrix(int r,int c):row(r),col(c){ memset(m, , sizeof(m)); }
  53.  
  54. bool unitMatrix(){
  55. if(row != col) return false;
  56. for(int i = ;i < row;i++) //方阵才有单位矩阵;
  57. m[i][i] = ;
  58. return true;
  59. }
  60. Matrix operator *(const Matrix& t){
  61. Matrix res(row, t.col);
  62. for(int i = ; i < row; i++)
  63. for(int j = ;j < t.col;j++)
  64. for(int k = ; k < col; k++)
  65. res.m[i][j] = (res.m[i][j] + m[i][k]*t.m[k][j])% mod;
  66. return res;
  67. }
  68. void print(){
  69. for(int i = ;i < row; i++){
  70. for(int j = ;j < col; j++)
  71. printf("%lld ",m[i][j]);
  72. puts("");
  73. }
  74. }
  75. };
  76.  
  77. Matrix pow(Matrix a, ll n)
  78. {
  79. Matrix res(a.row, a.col);
  80. res.unitMatrix();
  81. while(n){
  82. if(n & ) res = res*a;
  83. a = a*a;
  84. n >>= ;
  85. }
  86. return res;
  87. }
  88. ll POW(ll a,int n, ll mod)
  89. {
  90. ll ans = ;
  91. while(n){
  92. if(n&) ans = (ans*a)%mod;
  93. a = a*a%mod;
  94. n >>= ;
  95. }
  96. return ans;
  97. }
  98. int main()
  99. {
  100. //freopen("data.txt","r",stdin);
  101. //freopen("out.txt","w",stdout);
  102. Matrix mat(,);
  103. mat.m[][] = , mat.m[][] = ;
  104. mat.m[][] = , mat.m[][] = ;
  105. int T, kase = ;
  106. scanf("%d",&T);
  107. while(T--){
  108. int n;
  109. read2(n, mod);
  110. ll MOD = 1LL*(mod-)*(mod+);
  111. MOD = POW(,n,MOD);
  112. Matrix res = pow(mat, MOD);
  113. //res.print();
  114. Matrix tmp(,);
  115. tmp.m[][] = , tmp.m[][] = ;
  116. res = res*tmp;
  117. printf("Case #%d: %d\n",kase++, (*res.m[][]-)% mod);
  118. }
  119. return ;
  120. }

ps: 这道题循环节较小,直接求解循环节也可以A;

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  5. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  6. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  7. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  8. #define MS0(a) memset(a,0,sizeof(a))
  9. #define MS1(a) memset(a,-1,sizeof(a))
  10. #define MSi(a) memset(a,0x3f,sizeof(a))
  11. #define pb push_back
  12. #define MK make_pair
  13. #define A first
  14. #define B second
  15. #define clear0 (0xFFFFFFFE)
  16. #define inf 0x3f3f3f3f
  17. #define eps 1e-8
  18. #define zero(x) (((x)>0?(x):-(x))<eps)
  19. #define bitnum(a) __builtin_popcount(a)
  20. #define lowbit(x) (x&(-x))
  21. #define K(x) ((x)*(x))
  22. typedef pair<int,int> PII;
  23. typedef long long ll;
  24. typedef unsigned long long ull;
  25. typedef unsigned int uint;
  26. template<typename T>
  27. void read1(T &m)
  28. {
  29. T x = ,f = ;char ch = getchar();
  30. while(ch <'' || ch >''){ if(ch == '-') f = -;ch=getchar(); }
  31. while(ch >= '' && ch <= ''){ x = x* + ch - '';ch = getchar(); }
  32. m = x*f;
  33. }
  34. template<typename T>
  35. void read2(T &a,T &b){read1(a);read1(b);}
  36. template<typename T>
  37. void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
  38. template<typename T>
  39. void out(T a)
  40. {
  41. if(a>) out(a/);
  42. putchar(a%+'');
  43. }
  44. inline ll gcd(ll a,ll b){ return b == ? a: gcd(b,a%b); }
  45. template<class T1, class T2> inline void gmax(T1& a, T2 b){ if(a < b) a = b;}
  46. template<class T1, class T2> inline void gmin(T1& a, T2 b){ if(a > b) a = b;}
  47.  
  48. ll pow(ll a,uint n,int mod)
  49. {
  50. ll ans = ;
  51. while(n){
  52. if(n&) ans = (ans*a)%mod;
  53. a = a*a%mod;
  54. n >>= ;
  55. }
  56. return ans;
  57. }
  58. const int maxn = ;
  59. int F[maxn];
  60. int main()
  61. {
  62. //freopen("data.txt","r",stdin);
  63. //freopen("out.txt","w",stdout);
  64. int T, kase = ;
  65. /*double d1 = 5+2*sqrt(6), d2 = 5 - 2*sqrt(6);
  66. rep1(i,1,10){
  67. printf("%.5f\n",pow(d1,i)+pow(d2,i));
  68. }*/
  69. scanf("%d",&T);
  70. while(T--){
  71. uint x, mod;
  72. read2(x,mod);
  73. F[] = %mod, F[] = %mod;
  74. ll cycle = -;
  75. for(int i = ; ; i++){
  76. F[i] = (*F[i-] - F[i-]+ mod)% mod;
  77. if(F[i] == F[] && F[i-] == F[]){
  78. cycle = i-;
  79. break;
  80. }
  81. }
  82. int p = pow(,x, cycle);
  83. printf("Case #%d: %d\n",kase++, F[p]-);
  84. }
  85. return ;
  86. }

hdu 5451 Best Solver 矩阵循环群+矩阵快速幂的更多相关文章

  1. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  2. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  3. Hdu 5451 Best Solver (2015 ACM/ICPC Asia Regional Shenyang Online) 暴力找循环节 + 递推

    题目链接: Hdu  5451  Best Solver 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 解题思路: x的取值为[1, 232],看到这个指数,我的心情是异常崩 ...

  4. ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 && 快速幂)(2015沈阳网赛1002题)

    Problem Description The so-called best problem solver can easily solve this problem, with his/her ch ...

  5. HDU 5451 Best Solver 数论 快速幂 2015沈阳icpc

    Best Solver Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Tota ...

  6. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  7. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  8. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

  9. poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Descri ...

随机推荐

  1. android studio1.3安装终于成功

    本人机器是win7 32位旗舰版,4G内存.以前使用eclipse adt bundle开发Android程序感觉非常方便,但随着google对andriod studio支持力度加大,转向studi ...

  2. Android的Task和Activity相关

    android:allowTaskReparenting    用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移 ...

  3. IIs站点的建立

    控制面板——管理工具——Internet信息服务管理器 首先应设置的文件权限:System 和 admin 程序池:4.0 编辑权限:iis apppool\名称 身份验证:匿名身份——应用程序池标识

  4. hdu-5686 Problem B(斐波那契数列)

    题目链接: Problem B Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) ...

  5. hdu 4144 状态压缩dp

    #include<map> #include<set> #include<cmath> #include<queue> #include<cstd ...

  6. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  7. 导出用户列表到Excel的几种方法

    最近客户在咨询着怎么把SharePoint上面的用户列表给到出Excel,查看了一下,SharePoint并没有提供直接可用的导出功能(虽然都是List,但就是不让你导出...) 网上搜索了一下,方法 ...

  8. 跟我一起学习ASP.NET 4.5 MVC4.0(一)(转)

    由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一下ASP. ...

  9. SQL Server 事务处理 回滚事务

    --创建表: GO CREATE TABLE [dbo].[tb1]( [Id] [int] NOT NULL, [c1] [nvarchar](50) NULL, [c2] [datetime] N ...

  10. C#创建Windows服务入门图解(VS2010)

    C#创建Windows服务入门图解(VS2010) Windows服务大家都知道,比如Audio.Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的.所 ...