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. SQL练习题笔记

    查找最晚入职员工的所有信息 select * from employees order by hire_date desc limit 1 查找入职员工时间排名倒数第三的员工所有信息 select * ...

  2. C++实现顺序栈类求解中缀表达式的计算

    控制台第一行打印的数值为使用形如以下方式得到的结果: cout << +*(+)*/- << endl; 即第一个待求解表达式由C++表达式计算所得结果,以用于与实现得出的结果 ...

  3. 【转】如何在命令行脚本中启动带参数的Windows服务

    我们有一个自己编写的Windows服务,我们希望该服务在启动时可以根据用户输入的参数实现不同的功能. 要实现这样的需求并不是很难,下面这个例子我用来示范如何编写该服务 using System; us ...

  4. STM32F407 NVIC 中断优先级管理 个人笔记

    内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC) 设置中断向量的优先级并使能. 响应优先级& 抢占优先级 抢占优先级:一个中断A还在处 ...

  5. Linux CentOS命令行界面字体重复问题解决记录

    问题描述: 安装完CentOS 6.5 mini版之后,安装图形界面,启动之后出现如下问题,字体有重复 应该是因为字体原因, 我的解决方法: yum -y install dejavu-sans-* ...

  6. [luoguP3178] [HAOI2015]树上操作(dfs序 + 线段树 || 树链剖分)

    传送门 树链剖分固然可以搞. 但还有另一种做法,可以看出,增加一个节点的权值会对以它为根的整棵子树都有影响,相当于给整棵子树增加一个值. 而给以某一节点 x 为根的子树增加一个权值也会影响当前子树,节 ...

  7. 【设计模式】GOF设计模式趣解(23种设计模式)

    创建型模式                   1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说 ...

  8. ArrayList去除重复元素

    去除一个ArrayList的重复元素有两种方法:(ArrayList与Vector的存储结构是Object[],LinkedList是双向列表) 第一种是不需要借助临时list,用equals方法比较 ...

  9. java容器详解(以Array Arrays ArrayList为例)

    //先记录一个想法……java实在是太臃肿了,纯面向对象也有不少弊端…… //能不能把java精简一下啊! 先上结论: Array:认真看api索引的话,Array有两个.一个是sql中的接口,一个是 ...

  10. Android应用程序项目结构

    Android应用程序项目结构 [src]:JAVA源代码目录 [gen]:由系统自动生成的JAVA源码文件,不可修改,只可查看和使用 加载的和依赖的类库 [assets]:本地存储文件的一个文件夹 ...