luogu1939 【模板】矩阵加速(数列)
upd:现在推荐使用一个长度为 \(n\) 的一维向量。若状态矩阵 \(F\) 对下一时间的状态矩阵 \(F'\) 有影响,则 \(F'=FA\) 中的 转移矩阵 \(A\) 的赋值方法是:
若状态矩阵中的第 \(x\) 个数对下一单位时间的状态矩阵的第 \(y\) 个数有影响,则将转移矩阵的第 \(x\) 行第 \(y\) 列赋值为合适的数。
递推太慢,用矩阵加速。
有递推关系
\]
若有目标矩阵 \(\boldsymbol{F}\) :
\begin{matrix}
f_i \\
f_{i-1} \\
\vdots \\
f_{i-k+1}
\end{matrix}
\right]
\]
与已得出的矩阵 \(\boldsymbol{F'}\) :
\begin{matrix}
f_{i-1} \\
f_{i-2} \\
\vdots \\
f_{i-k}
\end{matrix}
\right]
\]
则式子 \(\boldsymbol{F}=\boldsymbol{A}\boldsymbol{F'}\) 中的 $ \boldsymbol{A}$ 为:
\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 【模板】矩阵加速(数列)的更多相关文章
- 洛谷 [P1939] 矩阵加速数列
矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...
- Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)
补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...
- P1939【模板】矩阵加速(数列)
P1939[模板]矩阵加速(数列)难受就难受在a[i-3],这样的话让k=3就好了. #include<iostream> #include<cstdio> #include& ...
- 洛谷 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)取余的值 ...
- 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】
hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...
- [洛谷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$的值. 解题思路:这题看似是很简单的 ...
- LuoGu P1939 【模板】矩阵加速(数列)
板子传送门 矩阵快速幂学完当然要去搞一搞矩阵加速啦 (矩阵加速相对于矩阵快速幂来说就是多了一个构造矩阵的过程) 关于怎样来构造矩阵,这位大佬讲的很好呢 构造出矩阵之后,我们再去用矩阵快速幂乘出来,取[ ...
- P1349 广义斐波那契数列(矩阵加速)
P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...
- 洛谷 P1939 矩阵加速(数列)
题意简述 \(a[1]=a[2]=a[3]=1\) \(a[x]=a[x−3]+a[x−1](x>3)\) 求a数列的第n项对1000000007取余的值. 题解思路 矩阵加速 设\[ F=\b ...
随机推荐
- Spring Aspect 获取请求参数
切片(Aspect)也就是Spring AOP 实现Aspect的主要步骤: 1.在哪里切入 .在哪个方法起作用 .什么时候起作用 2.起作用的时候执行什么处理逻辑 下面是代码实现 /** * 切片A ...
- go语言简单的soap调用方法
package main import ( "bytes" "encoding/xml" "fmt" "io" &quo ...
- Echarts获取数据绘制图表
这次是利用mui框架实现一个手机移动端的项目.基本的框架已经实现,主要来获取数据实现一个图表的展示. 首先引入插件:echarts.js <script src="../resourc ...
- 关于dopost和doget中文乱码问题
1.doPost方法请求方式为Post 请求内容中包含请求体,因此解决方法较简单,只要改变请求体的编码即可,具体方法setCharacterEncoding("utf-8"); 2 ...
- 家校通Code
9 http://dlwt.csdn.net/fd.php?i=621573845033702&s=44d46a459acce7fef39aa4dcff51bfba
- BZOJ 4563: [Haoi2016]放棋子
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 389 Solved: 248[Submit][Status][Discuss] Descriptio ...
- 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据
所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据. 本文介绍如何使用Java代码将一张图片的隐藏信息读取出来. 首先不需要下载任何额外的Java库,用JDK自带的库就 ...
- prometheus-简介及安装
监控是整个产品周期中最重要的一环,及时预警减少故障影响免扩大,而且能根据历史数据追溯问题. 对系统不间断实时监控 实时反馈系统当前状态 保证业务持续性运行 监控系统 监控方案 告警 特点 适用 Zab ...
- superset docker 部署
公众号原文有更多效果图哦 一.使用自己的数据库 1. 拉取项目 // 创建目录用于存放项目 mkdir -p /mnt/superset cd /mnt/superset git clone http ...
- 《剑指offer》39题—数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...