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项:

     



#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define C 240
#define S 20
using namespace std; const int maxn = 15;
const int mod = 7777777; int k;
struct matrix
{
_LL mat[maxn][maxn];
void init()
{
memset(mat,0,sizeof(mat));
for(int i = 1; i <= maxn; i++)
mat[i][i] = 1;
}
}a,b; matrix mul(matrix a, matrix b)
{
matrix ans;
memset(ans.mat,0,sizeof(ans.mat)); for(int i = 1; i <= k; i++)
{
for(int g = 1; g <= k; g++)
{
if(a.mat[i][g] == 0) continue;
for(int j = 1; j <= k; j++)
{
ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][g] * b.mat[g][j])%mod;
}
}
}
return ans;
} matrix pow(matrix a, int n)
{
matrix ans;
ans.init(); while(n)
{
if(n&1)
ans = mul(ans,a);
a = mul(a,a);
n >>= 1;
}
return ans;
} int main()
{
int n;
while(~scanf("%d %d",&k,&n))
{
memset(a.mat,0,sizeof(a.mat)); for(int i = 1; i <= k-1; i++)
a.mat[i][i+1] = 1;
for(int i = 1; i <= k; i++)
a.mat[k][i] = 1; matrix ans = pow(a,n-k);
memset(b.mat,0,sizeof(b.mat)); b.mat[0][1] = 1;
for(int i = 1; i <= k; i++)
{
for(int j = 0; j < i; j++)
b.mat[i][1] += b.mat[j][1];
}
ans = mul(ans,b);
printf("%I64d\n",ans.mat[k][1]);
}
return 0;
}



矩阵经典题目七: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. 解决CSDN阅读全部需要登录的问题

    现在CSDN网站每次点击“阅读全部”的时候,必须要登录才能展开,很不方便.解决方法如下:点击F12打开开发者工具,点击Console,将下面两行代码粘贴进去即可: $("div.articl ...

  2. 从多表连接后的select count(*)看待SQL优化

    从多表连接后的select count(*)看待SQL优化 一朋友问我,以下这SQL能直接改写成select count(*) from a吗? SELECT COUNT(*) FROM a LEFT ...

  3. maven打包oracle jdbc驱动

    背景 由于版权问题,maven中央仓库缺少oracle jdbc的驱动,这个给开发带来了很多不便利性.也出现各种各样的解决方案,基本就两种思路: 将oracle驱动安装到本地仓库,这个需要大家统一好名 ...

  4. 第五讲:Fast RTL-level verification

    1.good code styles 2.+rad compile time switch  for compile 1.了解VCS 的架构  <===这方便了解不多 parser / even ...

  5. 如何在Python中显式释放内存?

    根据Python官方文档,您可以强制垃圾收集器释放未引用的内存gc.collect().例: import gc gc.collect() 所属网站分类: python高级 > 综合&其 ...

  6. POJ 3310 Caterpillar(图的度的判定)

    题意: 给定一幅图, 问符不符合一下两个条件: (1) 图中没有环 (2)图中存在一条链, 点要么在链上, 要么是链上点的邻居. 分析: 建图,记录度数, 去掉所有度为1的点, 然后看看剩下是否是有2 ...

  7. 大数据学习——HDFS的shell

    -help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 备注:这些参数中,所有的hdfs路径都 ...

  8. 数据库服务器的监控 赛门铁克 Veritas i3 APM 查找指定时间段最耗服务器资源的TopSQL

  9. Leetcode 230.二叉搜索树第k小的数

    二叉搜索树第k小的数 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输 ...

  10. PTA 05-树7 堆中的路径 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径   (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...