upd:现在推荐使用一个长度为 \(n\) 的一维向量。若状态矩阵 \(F\) 对下一时间的状态矩阵 \(F'\) 有影响,则 \(F'=FA\) 中的 转移矩阵 \(A\) 的赋值方法是:

若状态矩阵中的第 \(x\) 个数对下一单位时间的状态矩阵的第 \(y\) 个数有影响,则将转移矩阵的第 \(x\) 行第 \(y\) 列赋值为合适的数。


递推太慢,用矩阵加速。

有递推关系

\[f_i=a_{i-1}f_{i-1}+a_{i-2}f_{i-2}+\cdots+a_{i-k}f_{i-k}
\]

若有目标矩阵 \(\boldsymbol{F}\) :

\[\left[
\begin{matrix}
f_i \\
f_{i-1} \\
\vdots \\
f_{i-k+1}
\end{matrix}
\right]
\]

与已得出的矩阵 \(\boldsymbol{F'}\) :

\[\left[
\begin{matrix}
f_{i-1} \\
f_{i-2} \\
\vdots \\
f_{i-k}
\end{matrix}
\right]
\]

则式子 \(\boldsymbol{F}=\boldsymbol{A}\boldsymbol{F'}\) 中的 $ \boldsymbol{A}$ 为:

\[\left[
\begin{matrix}
a_1 & a_2 & a_3 & \cdots & a_k \\
1 &0 & 0 & \cdots &0 \\
0 &1 & 0 & \cdots &0 \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & 1 & 0
\end{matrix}
\right]
\]

从 \(\boldsymbol{F'}\) 变换到 \(\boldsymbol{F}\) 所需要的次数 $ i $ 即为 \(\boldsymbol{A}\) 的指数。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int T;
ll n;
const ll mod=1e9+7;
struct Matrix{
ll num[5][5];
Matrix operator*(const Matrix &x)const{
Matrix res;
for(int i=1; i<=3; i++)
for(int j=1; j<=3; j++){
res.num[i][j] = 0;
for(int k=1; k<=3; k++)
res.num[i][j] = (res.num[i][j]+num[i][k]*x.num[k][j]%mod)%mod;
}
return res;
}
Matrix operator^(ll k)const{
Matrix res, x=*this;
memset(res.num, 0, sizeof(res.num));
for(int i=1; i<=3; i++) res.num[i][i] = 1;
//把res初始化成一个单位矩阵
while(k){
if(k&1) res = res * x;
x = x * x;
k >>= 1;
}
return res;
}
}a, b;
int main(){
cin>>T;
while(T--){
scanf("%lld", &n);
if(n<=3) printf("1\n");
else{
memset(a.num, 0, sizeof(a.num));
memset(b.num, 0, sizeof(b.num));
a.num[1][1] = a.num[1][3] = a.num[2][1] = a.num[3][2] = 1;
for(int i=1; i<=3; i++) b.num[i][1] = 1;
n -= 3;
a = a ^ n;
b = a * b;
//矩阵快速幂
printf("%lld\n", b.num[1][1]);
}
}
return 0;
}

luogu1939 【模板】矩阵加速(数列)的更多相关文章

  1. 洛谷 [P1939] 矩阵加速数列

    矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...

  2. Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)

    补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...

  3. P1939【模板】矩阵加速(数列)

    P1939[模板]矩阵加速(数列)难受就难受在a[i-3],这样的话让k=3就好了. #include<iostream> #include<cstdio> #include& ...

  4. 洛谷 P1939 【模板】矩阵加速(数列) 解题报告

    P1939 [模板]矩阵加速(数列) 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值 ...

  5. 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】

    hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...

  6. [洛谷P1939]【模板】矩阵加速(数列)

    题目大意:给你一个数列a,规定$a[1]=a[2]=a[3]=1$,$a[i]=a[i-1]+a[i-3](i>3)$求$a[n]\ mod\ 10^9+7$的值. 解题思路:这题看似是很简单的 ...

  7. LuoGu P1939 【模板】矩阵加速(数列)

    板子传送门 矩阵快速幂学完当然要去搞一搞矩阵加速啦 (矩阵加速相对于矩阵快速幂来说就是多了一个构造矩阵的过程) 关于怎样来构造矩阵,这位大佬讲的很好呢 构造出矩阵之后,我们再去用矩阵快速幂乘出来,取[ ...

  8. P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...

  9. 洛谷 P1939 矩阵加速(数列)

    题意简述 \(a[1]=a[2]=a[3]=1\) \(a[x]=a[x−3]+a[x−1](x>3)\) 求a数列的第n项对1000000007取余的值. 题解思路 矩阵加速 设\[ F=\b ...

随机推荐

  1. 挂sqlserver计划,系统自动分配拣货任务

    USE [P2WMS_WH43] GO /****** Object: StoredProcedure [dbo].[sp_fru_CalcAllocatePickData] Script Date: ...

  2. userBean之设置属性

    package com.java.model; public class Student { private String name;private int age; public String ge ...

  3. HDU 3681 Prison Break 越狱(状压DP,变形)

    题意: 给一个n*m的矩阵,每个格子中有一个大写字母,一个机器人从‘F’出发,拾取所有的开关‘Y’时便能够越狱,但是每走一格需要花费1点能量,部分格子为充电站‘G’,每个电站只能充1次电.而且部分格子 ...

  4. SGU 258 Almost Lucky Numbers 接近幸运数(数位DP)

    题意: 定义一个具有2n位的正整数,其前n位之和与后n位之和相等,则为lucky数.给定一个区间,问有多少个正数可以通过修改某一位数从而变成lucky数?注意不能含前导0. 思路: 我的想法是记录那些 ...

  5. windows server 2008 r2 启用 Windows Defender

    单击“开始”,指向“管理工具”,然后单击“服务器管理器”. 在“服务器管理器”中,单击“功能”,然后在“服务器管理器”细节窗格中的“功能摘要”下,单击“添加功能”. 此时会启动“添加功能向导”. 在“ ...

  6. 2018.5.8 XML编程

    1.XML的概念 XML(Extensible Markup Language)可扩展性标记语言是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识. 可拓展性标记语言是SGML( ...

  7. k8s1.13.0二进制部署-flannel网络(二)

    Flannel容器集群网络部署 Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来.VXLAN:将源数据包封装到UDP中,并使用基础网 ...

  8. 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究

    概述 关于树的概念很多,B树,B+树,红黑树等等. 但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁.没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科. 下面我要 ...

  9. beta版和alpha版

    外部测试版的意思. 软件会出现三种版本 1.alpha内部测试版本,极不稳定,一般也不会出现的公众视线,仅供内部测试人员测试用. 2.beta公共测试版,就是对外发布软件的测试版,收集公众的意见和建议 ...

  10. 通过脚本批量添加AD用户

    1.新建一个csv文件(逗号分隔的一种值文件) 内容为:放在C:\盘根目录下 test300 test300 .com test300 test301 test301 .com test301 tes ...