Login to join training plan
矩阵基础
https://oi-wiki.org/math/linear-algebra/matrix/
通俗理解,矩阵就是一个二维数组。例如:A=A1,1A2,1⋮An,1A1,2A2,2⋮An,2……⋱…A1,mA2,m⋮An,m
矩阵信息:
名称
主对角线:Ai,i 的元素;
方阵:行列数都为 n 的矩阵叫做方阵。
上三角矩阵:以 (1,1) 到 (n,n) 的对角线为界,左下全都是 0 的矩阵。
初等行列变换
https://oi-wiki.org/math/linear-algebra/elementary-operations/#%E5%88%9D%E7%AD%89%E5%8F%98%E6%8D%A2
初等行列变换:
- 交换任意两行或两列;
- 某一行增加 k 倍的另一行 或 某一列增加 k 倍的另一列;
- 某一行扩大 k 倍 或 某一列扩大 k 倍;
初等行列变换的形式简单,但性质不变。
高斯消元
https://oi-wiki.org/math/linear-algebra/gauss/
利用矩阵初等行列变换将方阵消成上三角矩阵。
操作:
- 用第一行乘以相应的系数消掉 [2,n] 行的第一列;
- 用第二行乘以相应的系数消掉 [3,n] 行的第二列;
- ......
- 用第 k 行乘以相应的系数消掉 (k,n] 行的第 k 列;
本质上就是个加减消元法。
高斯消元的应用:
时间复杂度 Θ(n3)。
矩阵乘法
https://oi-wiki.org/math/linear-algebra/matrix/#%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95
有结合律,没有交换律。
A×B=C,那么结果有如下规律:
C 的行数是 A 的行数,C 的列数是 B 的列数。
A 的列数和 B 的行数应当相等,假设为 k。
Ci,j 是 A 的第 i 行和 B 的第 j 列按位相乘再加和的结果,即 Ci,j=Ai,1×B1,j+Ai,2×B2,j+⋯+Ai,k×Bk,j。
矩阵求逆
https://oi-wiki.org/math/linear-algebra/matrix/#%E6%96%B9%E9%98%B5%E7%9A%84%E9%80%86
假设矩阵 A 的逆矩阵 B,那么可以得到:
A×B=I。
I 是除了主对角线是 1,其余都为 0 的矩阵。即 I=1000010000⋱00001。
将 A 和 I 拼在一起,将 A 高斯消元消成 I,右面的 I 跟着做同样的初等行列变换,这样 I 最后的结果就变成了 B。
矩阵快速幂
把快速幂原理应用到矩阵上就可以求 Ak。
快速幂函数不变,把整型变成矩阵型 (struct
) 即可。
注意重载矩阵乘法运算符。
时间复杂度 Θ(n3logk)。
优化递推(DP)
https://oi-wiki.org/math/linear-algebra/matrix/#%E7%9F%A9%E9%98%B5%E5%8A%A0%E9%80%9F%E9%80%92%E6%8E%A8
如果要快速求 fi 的值,其中 f 表示斐波那契数列,那么可以用矩阵快速幂的方法。
由于 fi=fi−1+fi−2,所以可以通过下面的方法求解 fi。
定义两个 2×2 的矩阵 F 和 M。其中 M=[0111],F 初始为 [f10f20]。
将 F 更新成 F 与 M 的乘积,即 F=[f1×0+f2×10×0+0×1f1×1+f2×10×1+0×1]=[f20f30],那么此时我们就得到了 f3 的值。
同理,如果再次 F←F×M,我们也可以得到 f4 的值。那么如果要得到 fn 的值只需要计算 F×Mn−2 即可,那么最后就有 fn=F1,2。
这样我们就把求斐波那契数列的 Θ(n) 的复杂度降到了 Θ(logn),是十分优秀的。
这样我们就把一个递推问题通过矩阵快速幂的形式进行了优化,同理对于一些其它的递推式也是可以通过类似的方法优化。
数学性质
-
在 mod 质数意义下 1∼n−1 逆元互不相同。
-
n=d∣n∑φ(d)
-
两个不同数的 gcd 不会超过两个数的差。
-
gcd(a,b)=1⟺gcd(a+k×b,b)=1
-
Cnk=Cn−1k−1×kn
-
n 个 [0,1] 随机变量的期望 k 小是 n+1k。
-
在 gcd(a1,a2,a3,…,an) 中,∀i=j,a±aj 都不会对答案产生影响。
-
i=0∑kCn+r−1r=Cn+kk
-
Cnm=i=1∏min+1−i
-
卡特兰数:
- h0=h1=1
- hn=i=0∑n−1hi×hn−i−1=n+1C2nn
-
⌈BA⌉=⌊BA+B−1⌋