[洛谷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$的值。
解题思路:这题看似是很简单的递推,但是$n\leq 2×10^9$,递推肯定是会超时的。故我们需要优化。
常见优化有矩阵加速,还有什么我并不知道了。
用矩阵可将此类题目时间复杂度从$O(n)$优化为$O(\log_2 n)$。
具体对于此类形如$f(n)=f(n-1)*p(1)+f(n-2)*p(2)+...+f(n-k)*p(k)$的线性递推问题,有如下解法。
设$F[i]=\begin{bmatrix} fn-k] \\f[n-k+1]\\f[n-k+2]\\...\\f[n-1]\\f[n] \end{bmatrix}\quad$,
则$F[n]=\begin{bmatrix} 0&1&0&0&...&0\\0&0&1&0&...&0\\0&0&0&1&...&0\\...&...&...&...&...&...\\0&0&0&0&...&1\\p[k]&p[k-1]&p[k-2]&p[k-3]&...&p[1]\end{bmatrix}\quad ×F[n-1]$。
运用矩阵快速幂即可完成加速。
故此题解法如下。
$$\begin{bmatrix}a[n-2]\\a[n-1]\\a[n]\end{bmatrix}\quad =\begin{bmatrix}0&1&0\\0&0&1\\1&0&1\end{bmatrix}^{n-3}\quad×\begin{bmatrix}a[1]\\a[2]\\a[3]\end{bmatrix}\quad$$
C++ Code:
#include<cstdio>
#include<cstring>
using namespace std;
struct mat{
long long a[30][30];
int r,c;
};
mat mul(mat x,mat y){
mat ans;
memset(&ans,0,sizeof ans);
for(int i=0;i<x.r;++i)
for(int j=0;j<y.c;++j)
for(int k=0;k<x.c;++k)
ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j])%1000000007;
ans.r=x.r;
ans.c=y.c;
return ans;
}
void pow(int n){
mat p;
memset(&p,0,sizeof p);
p.r=p.c=3;
p.a[0][1]=p.a[1][2]=p.a[2][0]=p.a[2][2]=1;
mat ans;
memset(&ans,0,sizeof ans);
ans.r=ans.c=3;
ans.a[0][0]=ans.a[1][1]=ans.a[2][2]=1;
while(n){
if(n&1){
ans=mul(p,ans);
}
p=mul(p,p);
n>>=1;
}
p.a[0][0]=p.a[1][0]=p.a[2][0]=1;
p.c=1;
ans=mul(ans,p);
printf("%d\n",(int)ans.a[2][0]);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
if(n<4)puts("1");else
pow(n-3);
}
return 0;
}
[洛谷P1939]【模板】矩阵加速(数列)的更多相关文章
- 【洛谷P1939】 矩阵加速模板
https://www.luogu.org/problemnew/show/P1939 矩阵快速幂 斐波那契数列 首先看一下斐波那契数列的矩阵快速幂求法: 有一个矩阵1*2的矩阵|f[n-2],f[n ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷 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)取余的值 ...
- 洛谷 P1939 矩阵加速(数列)
题意简述 \(a[1]=a[2]=a[3]=1\) \(a[x]=a[x−3]+a[x−1](x>3)\) 求a数列的第n项对1000000007取余的值. 题解思路 矩阵加速 设\[ F=\b ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
随机推荐
- MyLayer MyScene
//MyLayer.h #include "cocos2d.h" USING_NS_CC; class MyLayer : public CCLayer { public: sta ...
- eclipse启动错误:An internal error occurred during: "reload maven project".
解决方案一: 简单粗暴!直接删除E:\eclipseWorkspace\.metadata目录!然后再单个导入eclipseWorkspace中的项目. 解决方案二: 打开这个配置文件:E:\ecli ...
- System.IO.FileLoadException异常
未能加载文件或程序集“NHibernate, Version=4.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4”或它的某一个依赖 ...
- WPF 样式
样式是属性值的集合,能被应用到一个元素,类似CSS,每个控件最多只能有一个样式,通过控件的Stype属性应用样式,如下代码,其中BigFontButtonStyle是用于检索资源的关键字,也可以通过代 ...
- Eclipse中將Java项目转变为Java Web项目
1.在项目上点击右键=>properties,在Project Facets配置项中,勾选Dynamic Web Module.Java.JavaScript选项. 2.用记事本打开项目目录下的 ...
- 1806最大数 string和sort函数用法
1.C++自带sort函数用法 sort函数有三个参数: (1)第一个是要排序的数组的起始地址 (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小 ...
- Html表单提交到Servlet输出到页面乱码
Html使用的编码是UTF-8编码显示页面,之后使用form表单提交字段到Servlet中,Servlet将利用getParamer方法获得form提交的字段,之后通过Respone中的writer将 ...
- linux操作---cd
cd命令用于切换工作路径,格式是cd [选项][参数]: [选项] -p 如果切换的工作目录是一个符号连接,直接切换到符号连接指向的目标目录: -L 如果切换的工作目录是一个符号连接,直接切换到符 ...
- 紫书 习题8-19 UVa 1312 (枚举技巧)
这道题参考了https://www.cnblogs.com/20143605--pcx/p/4889518.html 这道题就是枚举矩形的宽, 然后从宽再来枚举高. 具体是这样的, 先把所有点的高度已 ...
- [React] Refactor a Stateful List Component to a Functional Component with React PowerPlug
In this lesson we'll look at React PowerPlug's <List /> component by refactoring a normal clas ...