无耻的粘自Margatroid
前置技能
矩阵乘法
复杂度为 O(n3) ,有复杂度稍低的分治写法,不过意义不大(毕竟你的矩阵这么小)
A,B 是两个矩阵,其中 A 是 m×n 的矩阵, B 是 x×y 的矩阵
A=[a11a21a12a22a13a23], B=⎡⎣⎢b11b21b31b12b22b32⎤⎦⎥
当且仅当
n=x 时
A⋅B 有意义。
注意:矩阵乘法不满足交换律,设 C=A⋅B ,则
cik=∑j=1naijbjk
一般的,我们用矩阵去
左乘一个向量,来对该向量进行
线性变换。
如果对于矩阵乘法仅仅是会写代码的程度,请深入理解并能够手算,否则不要阅读以下内容。
快速幂
复杂度 O(logn)
这个没啥好说的,如果不会可以上网搜或者看我之前的博客
矩阵快速幂
矩阵加上快速幂,可以迅速求出线性递推式的第 n 项,或者是前 n 项和(必须是线性组合)
求斐波那契数列
斐波那契数列的定义:
F1=F2=1, Fn=Fn−1+Fn−2
我们注意到,该数列的第 n 项是第 n−1 项和第 n−2 项的线性组合(你tm在放屁)
我们构造一个列向量:
A=[Fn−1Fn−2]
然后我们考虑第 n+1 项,是第 n 项和第 n−1 项的线性组合(简直是废话)
同样的,我们也可以构造一个列向量:
B=[Fn−1+Fn−2Fn−1]
然后我们考虑一下怎么把 A 经过一波骚变换而把它变成 B ,由于这是向量之间线性组合,左乘一个矩阵是可以的:
[1011][Fn−1Fn−2]=[Fn−1+Fn−2Fn−1]
嗯,就这样变换。
如果我要求第 n 项,就再左乘 n−2 个同样的矩阵,所以,我们有:
[1011]n−2[F1F2]=[FnFn−1]
然后左边的那个矩阵的幂可以用快速幂处理,可以在
O(logn) 时间内求出,再乘一下那个列向量,就得到了我们要求的东西。
进阶版:求两项的线性递推式
题目:COGS
其实就是给斐波那契数列加上了系数。
矩阵会变成这样:
[a0b1][Fn−1Fn−2]=[aFn−1+bFn−2Fn−1]
极限版:求n项的线性递推式
题目:COGS
嗯。。。这个就比较毒瘤了。。。
还是要构造矩阵。。(怕是要敲公式敲死)
还是去网上搜一个矩阵粘下来吧(懒癌爆发)
好像并没有人手敲矩阵。。决定吃螃蟹。。。
求
f(n)=a1f(n−1)+a2f(n−2)+...+adf(n−d) (n>d)
其中 a1,a2,⋯an 和 f(1),f(2),⋯f(n) 已知。
大力构造矩阵:(md真丑)
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢a1100⋮0a2010⋮0a3001⋮0⋯⋯⋯⋯⋱⋯1an000⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f(n)f(n−1)f(n−2)f(n−3)⋮⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f(n+1)f(n)f(n−1)f(n−2)⋮⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
啊。。我尽力了。。。就是这样。。敲公式真累。。。
求斐波那契数列的前n项和
即求
∑i=1nFi
这个和之前的还是不太一样的,没有明确的递推式。
我们注意到前 n 项和 sumn 是 sumn−1 和 Fn 的线性组合,然后构造矩阵:
⎡⎣⎢100111110⎤⎦⎥⎡⎣⎢sumn−1Fn−1Fn−2⎤⎦⎥=⎡⎣⎢sumnFnFn+1⎤⎦⎥
求自然数列的前n项平方和
即求:
∑i=1ni2
由于
sumn+1 是
sumn 与
(i+1)2 的线性组合,
(i+1)2 是
i2, i, 1 的线性组合,因此可以构造矩阵:
⎡⎣⎢⎢⎢⎢1000110022101111⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢sumni2i1⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢sumn+1(i+1)2(i+1)1⎤⎦⎥⎥⎥⎥⎥
求斐波那契数列的前n项平方和
即求
∑i=1nF2i
注意到
sumn 是
F2n 与
sumn−1 的线性组合,而
F2n 是
F2n−1 和
F2n−2 和
Fn−1Fn−2 的线性组合,所以构造矩阵:
⎡⎣⎢⎢⎢⎢1000111111002201⎤⎦⎥⎥⎥⎥⋅⎡⎣⎢⎢⎢⎢⎢sumn−1F2n−1F2n−2Fn−1⋅Fn−2⎤⎦⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢sumnF2nF2n−1Fn⋅Fn−1⎤⎦⎥⎥⎥⎥⎥
注意在推矩阵的最后以后时使用了一些骚操作,可以手推一下验证一下正确性
求自然数列的前n项立方和
即求:
∑i=1ni3
注意到
sumn+1 是
(i+1)3 与
sumn 的线性组合,而
(i+1)3=i3+3i2+3i+1 ,是
i3,i2,i,1 的线性组合,
(i+1)2=i2+2i+1 ,是
i2 与
i 的线性组合,
i+1 是
i 与
1 的线性组合,因此构造矩阵:
⎡⎣⎢⎢⎢⎢⎢⎢⎢1000011000331003321011111⎤⎦⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢sumni3i2i1⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢sumn+1(i+1)3(i+1)2(i+1)1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
参考资料
- leakov-济南集训课件:网页链接
- 维基百科-矩阵乘法:网页链接
写在最后
本文中举出的一些例子有更简单的做法,比如后三个,之所以以最复杂的形式展示出来,是为了提高构造矩阵的能力。还有,敲公式真tm累