https://www.vijos.org/p/1067

非常easy推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]。

构造矩阵的方法:构造一个k*k的矩阵。当中右上角的(k-1)*(k-1)的矩阵是单位矩阵,第k行的每一个数分别相应f[n-1],f[n-2],,f[n-k]的系数。然后构造一个k*1的矩阵,它的第i行代表f[i](1 <= i <= k),是经过直接递推得到的。设ans[][]是第一个矩阵的n-k次幂乘上第二个矩阵。f[n]就是ans[k][1]。



注意:用__int64



更为一般的构造递推式矩阵的方法是:

我们能够用上面的方法二分求出不论什么一个线性递推式的第n项。其相应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1。矩阵第n行填相应的系数,其他地方都填0。

比如。我们能够用以下的矩阵乘法来二分计算f(n)
= 4f(n-1) - 3f(n-2) + 2f(n-4)的第k项:

     



  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <set>
  5. #include <list>
  6. #include <stack>
  7. #include <vector>
  8. #include <math.h>
  9. #include <string.h>
  10. #include <queue>
  11. #include <string>
  12. #include <stdlib.h>
  13. #include <algorithm>
  14. #define LL long long
  15. #define _LL __int64
  16. #define eps 1e-12
  17. #define PI acos(-1.0)
  18. #define C 240
  19. #define S 20
  20. using namespace std;
  21.  
  22. const int maxn = 15;
  23. const int mod = 7777777;
  24.  
  25. int k;
  26. struct matrix
  27. {
  28. _LL mat[maxn][maxn];
  29. void init()
  30. {
  31. memset(mat,0,sizeof(mat));
  32. for(int i = 1; i <= maxn; i++)
  33. mat[i][i] = 1;
  34. }
  35. }a,b;
  36.  
  37. matrix mul(matrix a, matrix b)
  38. {
  39. matrix ans;
  40. memset(ans.mat,0,sizeof(ans.mat));
  41.  
  42. for(int i = 1; i <= k; i++)
  43. {
  44. for(int g = 1; g <= k; g++)
  45. {
  46. if(a.mat[i][g] == 0) continue;
  47. for(int j = 1; j <= k; j++)
  48. {
  49. ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][g] * b.mat[g][j])%mod;
  50. }
  51. }
  52. }
  53. return ans;
  54. }
  55.  
  56. matrix pow(matrix a, int n)
  57. {
  58. matrix ans;
  59. ans.init();
  60.  
  61. while(n)
  62. {
  63. if(n&1)
  64. ans = mul(ans,a);
  65. a = mul(a,a);
  66. n >>= 1;
  67. }
  68. return ans;
  69. }
  70.  
  71. int main()
  72. {
  73. int n;
  74. while(~scanf("%d %d",&k,&n))
  75. {
  76. memset(a.mat,0,sizeof(a.mat));
  77.  
  78. for(int i = 1; i <= k-1; i++)
  79. a.mat[i][i+1] = 1;
  80. for(int i = 1; i <= k; i++)
  81. a.mat[k][i] = 1;
  82.  
  83. matrix ans = pow(a,n-k);
  84. memset(b.mat,0,sizeof(b.mat));
  85.  
  86. b.mat[0][1] = 1;
  87. for(int i = 1; i <= k; i++)
  88. {
  89. for(int j = 0; j < i; j++)
  90. b.mat[i][1] += b.mat[j][1];
  91. }
  92. ans = mul(ans,b);
  93. printf("%I64d\n",ans.mat[k][1]);
  94. }
  95. return 0;
  96. }



矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)的更多相关文章

  1. C++矩阵加速经典题目:Warcraft III 守望者的烦恼 [vijos 1067]

    Warcraft III 守望者的烦恼 背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫"闪烁", ...

  2. [矩阵十题第七题]vijos 1067 Warcraft III 守望者的烦恼 -矩阵快速幂

    背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她传送到后面的监狱内查看,她比较懒,一般不查看 ...

  3. vijos 1067 Warcraft III 守望者的烦恼 矩阵

    题目链接 我们可以很容易的推出dp的式子, dp[i] = sigma(j : 1 to k) dp[i-j]. 但是n太大了, 没有办法直接算, 所以我们构造一个矩阵, 然后快速幂就好了. 就像这样 ...

  4. VOJ 1067 Warcraft III 守望者的烦恼 (矩阵高速功率+dp)

    主题链接 明显的 dp[n] = dp[n-k] + dp[n-k+1] + ... +dp[n-1]; 然后要用矩阵来优化后面的状态转移. 也就是矩阵 0 1 0 0    a     b 0 0 ...

  5. (VIJOS) VOJ 1067 Warcraft III 守望者的烦恼 矩阵快速幂

    https://vijos.org/p/1067   就..挺普通的一道题..自己学一下怎么推式子就可以...细节不多但是我还是日常爆细节..比如说循环写成从负数开始...   只求ac不求美观的丑陋 ...

  6. vijos Warcraft III 守望者的烦恼

    题解 转移方程好写吧 一个一维递推式 然后我们可以构造矩阵优化 嗯,最近学一下递推优化 代码 #include<cstdio> #include<cstring> #inclu ...

  7. [Vijos1067]Warcraft III 守望者的烦恼(DP + 矩阵优化)

    传送门 可知 f[i] = f[i - 1] + f[i - 2] + ... + f[i - k] 直接矩阵优化就好了 #include <cstdio> #include <cs ...

  8. [vijos1067]Warcraft III 守望者的烦恼

    就是上次考得fyfy.竟然是原题... // It is made by XZZ #include<cstdio> #include<algorithm> #include&l ...

  9. vijosP1067Warcraft III 守望者的烦恼

    vijosP1067Warcraft III 守望者的烦恼 链接:https://vijos.org/p/1067 [思路] 矩阵乘法. 可以得出递推式:      f[i]=sum{ f[n-1], ...

随机推荐

  1. 360 Atlas中间件安装及使用

    1.下载Atlas wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm ...

  2. 【Mysql数据库】知识点总结

    本文转载自:http://www.cnblogs.com/tonghun/p/7191131.html 一 数据库常用操作 mysql -u+username -p+password:登陆数据库管理系 ...

  3. python接口自动化-发xml格式post请求

    前言 post请求相对于get请求多一个body部分,body部分常见的数据类型有以下四种(注意是常见的,并不是只有4种) application/x-www-form-urlencoded appl ...

  4. 大数据学习——mapreduce程序单词统计

    项目结构 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  5. mybatis自动映射和手动映射

    一对一查询 第一种方法: <!-- 查询所有订单信息 --> <select id="findOrdersList" resultType="cn.it ...

  6. Python浅拷贝copy()与深拷贝deepcopy()区别

    其实呢,浅拷贝copy()与深拷贝deepcopy()之间的区分必须要涉及到python对于数据的存储方式. 首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的 ...

  7. [NOIP1999] 提高组 洛谷P1014 Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...

  8. POJ 2488 A Knight's Journey【DFS】

    补个很久之前的题解.... 题目链接: http://poj.org/problem?id=2488 题意: 马走"日"字,让你为他设计一条道路,走遍所有格,并输出字典序最小的一条 ...

  9. uva 662

    dp +路径输出 #include <cstdio> #include <cstdlib> #include <cmath> #include <stack& ...

  10. css三大特性

    层叠性: 当多个样式(样式的优先级相同)作用于同一个(同一类)标签时,样式发生了冲突,总是执行后边的代码(后边代码层叠前边的代码).和标签调用选择器的顺序没有关系. 继承性: 文字的大多属性都可以继承 ...