矩阵乘法
这篇是给矩阵快速幂做基础的文章,我们来聊聊矩阵乘法。
先看看啥是个矩阵:
↑ 就是这个玩意,和二维数组看起来没什么区别
两个维度记录信息显然,这个家伙比一维要强
之后我们略过一些数学内容,直接来看矩阵乘法
这是两个矩阵,他们的乘法就是红框勾出部分的各项的乘积。
啊举个栗子
ans 11= (a 11×b 11)+ (a 12×b 21)+ (a 13×b 31)
没错很重要的一点就是:矩阵乘法的结果还是矩阵
大概原理如图:
上图所给的是最基本的情况,长和宽相同
那么一般情况呢?
不难想,我们可以得知最基本的一点:
a矩阵的行数=b矩阵的列数
还有一点,
对于结果矩阵:ans行数=a行数 ans列数=b列数
代码举例子(来自p1962)
struct mmp{
int n,m;//行,列
long long num[10][10];//每个位置上的数字
mmp operator *(const mmp &b)//重载运算符(矩阵相乘)
{
mmp c;
c.n=n;//结果矩阵:ans行数=a行数
c.m=b.m;//结果矩阵:ans列数=b列数
memset(c.num,0,sizeof(c.num));
for(int i=1;i<=n;i++)
for(int j=1;j<=b.m;j++)
for(int k=1;k<=m;k++)
c.num[i][j]=(c.num[i][j]+(num[i][k]%mod*b.num[k][j]%mod))%mod;//矩阵乘法
return c;
}
};
核心内容到此结束。
但我们就还可以掌握一项技能:
猜矩阵
比如拿dp题目来说,每个题都会有他固定的状态转移方程
那么我们需要做的就是去猜 此状态=前一状态*【猜测的矩阵】
比如P1962斐波那契
这个技巧需要反推的思路,实战分析请参照我的blog中P1962的题解