主题链接

明显的

dp[n] = dp[n-k] + dp[n-k+1] + ... +dp[n-1];

然后要用矩阵来优化后面的状态转移。

也就是矩阵

0 1 0 0    a     b

0 0 1 0 * b =  c

0 0 0 1    c     d

1 1 1 1    d    a+b+c+d

然后跑高速幂

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6. #define N 10
  7.  
  8. using namespace std;
  9. const int mod = 7777777;
  10. typedef long long LL;
  11.  
  12. struct matrix
  13. {
  14. LL a[10][10];
  15. }origin;
  16.  
  17. int n,m;
  18.  
  19. matrix multiply(matrix x,matrix y)
  20. {
  21. matrix temp;
  22. memset(temp.a,0,sizeof(temp.a));
  23. for(int i=0;i<n;i++)
  24. {
  25. for(int j=0;j<n;j++)
  26. {
  27. for(int k=0;k<n;k++)
  28. {
  29. temp.a[i][j]+=x.a[i][k]*y.a[k][j];
  30. temp.a[i][j]=(temp.a[i][j])%mod;
  31. }
  32. }
  33. }
  34. return temp;
  35. }
  36.  
  37. matrix matmod(matrix A,int k)
  38. {
  39. matrix res;
  40.  
  41. memset(res.a,0,sizeof res.a);
  42. for(int i=0;i<n;i++)res.a[i][i]=1;
  43.  
  44. while(k)
  45. {
  46. if(k&1)
  47. res=multiply(res,A);
  48. k>>=1;
  49. A=multiply(A,A);
  50. }
  51. return res;
  52. }
  53.  
  54. void print(matrix x)
  55. {
  56. for(int i=0;i<n;i++)
  57. {
  58. for(int j=0;j<n;j++)
  59. cout<<" "<<x.a[i][j];
  60. puts("");
  61. }
  62. printf("---------------\n");
  63. }
  64.  
  65. int main()
  66. {
  67. int k;
  68. while(cin>>n>>k)
  69. {
  70. memset(origin.a,0,sizeof origin.a);
  71.  
  72. origin.a[0][0]=1;
  73.  
  74. for(int i=1;i<=n;i++)
  75. {
  76. origin.a[i][0]=1;
  77. for(int j=0;j<i;j++)
  78. {
  79. origin.a[i][0]+=origin.a[j][0];
  80. }
  81. }
  82. // print(origin);
  83. matrix res;
  84. memset(res.a,0,sizeof res.a);
  85.  
  86. for(int i=0;i<n-1;i++)
  87. {
  88. res.a[i][i+1]=1;
  89. }
  90. for(int i=0;i<n;i++)res.a[n-1][i]=1;
  91. //print(res);
  92. res=matmod(res,k-1);
  93.  
  94. LL fans=0;
  95. for(int i=0;i<n;i++)
  96. {
  97. fans+=res.a[0][i]*origin.a[i][0];
  98. fans%=mod;
  99. }
  100. cout<<fans<<endl;
  101. }
  102. return 0;
  103. }

版权声明:本文博客原创文章。博客,未经同意,不得转载。

VOJ 1067 Warcraft III 守望者的烦恼 (矩阵高速功率+dp)的更多相关文章

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

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

  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. C++矩阵加速经典题目:Warcraft III 守望者的烦恼 [vijos 1067]

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

  5. 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

    https://www.vijos.org/p/1067 非常easy推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵.当中右上角 ...

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

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

  7. vijos Warcraft III 守望者的烦恼

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

  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. iosclient暑期“动画屋“活动项目总结

        入职实习的这个公司,第一天就分配了任务.从零開始写一个网页.之前尽管了解一些前端知识.但从头开写还是遇到了非常多问题,互联网公司讲求效率,有deadline还是比較有紧迫感的,与在实验室放羊状 ...

  2. css 简单 返回顶部 代码及注释说明

    1. 最简单的静态返回顶部,点击直接跳转页面顶部,常见于固定放置在页面底部返回顶部功能 方法一:用命名锚点击返回到顶部预设的id为top的元素 html代码 <a href="#top ...

  3. WPF Delegate委托整理

    那啥,是从这里整理出来的,感谢Rising_Sun,整理的过于简单,看不明白的戳这里 using System; using System.Collections.Generic; using Sys ...

  4. 如何使用 yum 安装/更新/移除 软件

    如何使用 yum 安装/更新/移除 软件 一. 建立仓库(repository)和源 a) 拷贝所以相关rpm包到某个目录 b) 执行createrepo  /目录/目录/目录/目录   注意:b)中 ...

  5. android 去除标题

    //去除标题,必须在setContentView之前设置 requestWindowFeature(Window.FEATURE_NO_TITLE);

  6. String,StringBuffer和StringBuilder的异同

                                                                    String,StringBuffer和StringBuilder的异同 ...

  7. javaweb学习总结(七)——HttpServletResponse对象(一)(转)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...

  8. ORACLE单字符函数的函数

     1.           ASCII(C) 说明:返回C的首字符在ASCII码中相应的十进制 举例: SQL>SELECT ASCII('A') A,ASCII('a') B,ASCII( ...

  9. 使用ZeroMQ(clrzmq)实现异步通信

    ZeroMQ是对Socket的封装,通过组合多种类型的结点可以实现复杂的网络通信模式.而且ZeroMQ设计简单,可以有多种平台实现,对于跨平台项目是一个福音. clrzmq是ZeroMQ的C#语言的实 ...

  10. OpenGL之路(八)加入�光照效果和键盘控制

    在opengl中加入�光照的效果,可用键盘控制放大缩小 w键放大 s键缩小 d键开关灯 预览效果例如以下: 源代码例如以下: #include <gl/glut.h> #include & ...