矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘,
两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等
相乘原则:
a b * A B = a*A+b*C a*c+b*D
c d C D = c*A+d*C c*A+d*C
上代码
struct matrix
{
ll a[maxn][maxn];
};
matrix matrix_mul(matrix x,matrix y)
{
matrix temp;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
temp.a[i][j]=;
for(int k=;k<=n;k++)
{
temp.a[i][j]+=(x.a[i][k]*y.a[k][j])%mod;
temp.a[i][j]%=mod;
}
}
return temp;
}
∵矩阵乘法满足结合律(不满足交换律)
∴可用快速幂
矩阵快速幂与一般快速幂极其相似,只是把两个数相乘改成了两个矩阵相乘(用个相乘函数即可),所以完全可以按照快速幂的写法来写;
matrix matrix_pow(matrix a,ll b)
{
matrix v;
for(int i=;i<=n;i++) v.a[i][i]=; //初始化,就和把数字初始化成 1 一样,矩阵这样初始化
while(b>)
{
if(b&) v=matrix_mul(v,a);
a=matrix_mul(a,a);
b=b>>;
}
return v;
}
※矩阵快速幂解决线性递推式
举个栗子(我有一盆栗子随便举) 斐波那契序列 (F[n]=F[n-1]+F[n-2])
很多童鞋知道矩阵快速幂可解决斐波那契序列,但并不知道原因
事实上矩阵快速幂可以解决绝大多数线性递推式(不敢说所有=-=,万一呢)
对于斐波那契,递推矩阵(自己起的=-=)为
1 1
0 1
具体推导初始矩阵过程如下(方法不唯一):(以斐波那契额为例)
我们要做的是使F[n-1]+F[n-2]乘某个矩阵得出第一项为F[n](个人理解的=-=)
则 F[n] = a b * F[n-1]
F[n-1] c d F[n-2]
∵F[n]=F[n-1]+F[n-2]
则可得 F[n-1]+F[n-2] = a b * F[n-1]
F[n-1] c d F[n-2]
设F[n-1]为A,F[n-2]为B
则为 A+B = a b * A = a*A+b*B (将右边矩阵乘开了)
B c d * B c*A+d*B
则可以看到 a*A+b*B=A+B
c*A+d*B=B
很容易看出a=1,b=1,c=0,d=1
所以递推矩阵为
1 1
0 1
普通斐波那契F[1]=1,F[2]=1;
那为什么可以用矩阵快速幂呢?
设上边的0,1为A,斐波那契初始矩阵为B,当N》=2的时候我们可以求斐波那契
比如斐波那契的3项就应该是
A*A*B即可(因为N大于等于2所以要把求得项数减去1然后再乘)
类似的我们可以求斐波那契的第N项
即A*A*A*......*A*B一共乘N-1项。
这个时候我们发现都是乘法耶~那我们就快速幂把,好~快速幂所以我们就完成了快速幂。
所以每一n-1幂所对应的F[n]就是答案,
但F[1]与F[2]为其他数呢,就不能只是这样做了
∵矩阵乘法满足交换律
∴现将递推矩阵进行n次幂运算
再使其乘 F[1] 矩阵,即可得出答案=-=
F[2]
矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式的更多相关文章
- 线性齐次递推式快速求第n项 学习笔记
定义 若数列 \(\{a_i\}\) 满足 \(a_n=\sum_{i=1}^kf_i \times a_{n-i}\) ,则该数列为 k 阶齐次线性递推数列 可以利用多项式的知识做到 \(O(k\l ...
- 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)
[背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- HDU-6185-Covering(推递推式+矩阵快速幂)
Covering Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
- hdu 5950 Recursive sequence 递推式 矩阵快速幂
题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
随机推荐
- 1.1.1. Atitit Cocos2d-JS v3.x的问题
1.1.1. Atitit Cocos2d-JS v3.x的问题 1.1. Api 兼容性 场景切换的api都不兼容了... 删除了比较多的api...可以dep啊.. 1.2. gui布局,, ...
- C#并行编程-Task
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- Java面试(1)-- Java赋值表达式
1 class Demo01{ 2 public static void main(String[] args){ 3 //赋值运算符 = 4 5 //例1 6 int a = 1; 7 System ...
- How Google TestsSoftware - Part One
This is the firstin a series of posts on this topic.The one question I get morethan any other is &qu ...
- 实现CSS等分布局的4种方式
× 目录 [1]float [2]inline-block [3]table[4]flex 前面的话 等分布局是指子元素平均分配父元素宽度的布局方式,本文将介绍实现等分布局的4种方式 思路一: flo ...
- LCA算法的理解
LCA思想: 在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中, 这样u结 ...
- c#socket同步通信
再次特别感谢张子阳老师的文章,读后深感益处. 废话不多说,先贴代码 这是服务器端代码 using System; using System.Collections.Generic; using Sys ...
- 你见过吗?9款超炫的复选框(Checkbox)效果
复选框(Checkbox)在各个浏览器中的效果不一致,因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能.下面就给大家分享9款超炫的复选框(Checkbox)效果,纯 CSS ...
- 推荐10个 CSS3 制作的创意下拉菜单效果
下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...
- MySQL(Navicat)运行.sql文件时报错:[Err] 2006 - MySQL server has gone away 的解决方法
背景: 今天导入一个数据量很大的.sql文件时,报错: 原因: 可能是sql语句过长,超过mysql通信缓存区最大长度. 解决:1. 编辑 MySQL 安装目录下的 my.ini,在最后添加以下内容: ...