矩阵基础

Login to join training plan

矩阵基础

https://oi-wiki.org/math/linear-algebra/matrix/

通俗理解,矩阵就是一个二维数组。例如:A=[A1,1A1,2A1,mA2,1A2,2A2,mAn,1An,2An,m]A = \begin{bmatrix} A_{1, 1} & A_{1, 2} & \dots & A_{1, m}\\ A_{2, 1} & A_{2, 2} & \dots & A_{2, m}\\ \vdots & \vdots & \ddots & \vdots\\ A_{n, 1} & A_{n, 2} & \dots & A_{n, m}\end{bmatrix}

矩阵信息:

  • 行数,列数;
  • 每行每列的元素;
  • 秩,行列式;

名称

主对角线:Ai,iA_{i, i} 的元素;

方阵:行列数都为 nn 的矩阵叫做方阵。

上三角矩阵:以 (1,1)(1, 1)(n,n)(n, n) 的对角线为界,左下全都是 00 的矩阵。


初等行列变换

https://oi-wiki.org/math/linear-algebra/elementary-operations/#%E5%88%9D%E7%AD%89%E5%8F%98%E6%8D%A2

初等行列变换:

  • 交换任意两行或两列;
  • 某一行增加 kk 倍的另一行 或 某一列增加 kk 倍的另一列;
  • 某一行扩大 kk 倍 或 某一列扩大 kk 倍;

初等行列变换的形式简单,但性质不变。


高斯消元

https://oi-wiki.org/math/linear-algebra/gauss/

利用矩阵初等行列变换将方阵消成上三角矩阵。

操作:

  • 用第一行乘以相应的系数消掉 [2,n][2, n] 行的第一列;
  • 用第二行乘以相应的系数消掉 [3,n][3, n] 行的第二列;
  • ......
  • 用第 kk 行乘以相应的系数消掉 (k,n(k, n] 行的第 kk 列;

本质上就是个加减消元法。

高斯消元的应用:

  • 解多元一次方程;
  • 求矩阵的秩;
  • 求矩阵的行列式;

时间复杂度 Θ(n3)\Theta(n ^ 3)


矩阵乘法

https://oi-wiki.org/math/linear-algebra/matrix/#%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95

有结合律,没有交换律。

A×B=CA \times B = C,那么结果有如下规律:

CC 的行数是 AA 的行数,CC 的列数是 BB 的列数。

AA 的列数和 BB 的行数应当相等,假设为 kk

Ci,jC_{i, j}AA 的第 ii 行和 BB 的第 jj 列按位相乘再加和的结果,即 Ci,j=Ai,1×B1,j+Ai,2×B2,j++Ai,k×Bk,jC_{i, j} = A_{i, 1}\times B_{1, j} + A_{i, 2}\times B_{2, j} + \dots + A_{i, k}\times B_{k, j}

矩阵求逆

https://oi-wiki.org/math/linear-algebra/matrix/#%E6%96%B9%E9%98%B5%E7%9A%84%E9%80%86

假设矩阵 AA 的逆矩阵 BB,那么可以得到:

A×B=IA \times B = I

II 是除了主对角线是 11,其余都为 00 的矩阵。即 I=[100001000000001]I = \begin{bmatrix}1 & 0 & 0 & 0\\0 & 1 & 0 & 0\\0 & 0 & \ddots & 0\\0 & 0 & 0 & 1\end{bmatrix}

AAII 拼在一起,将 AA 高斯消元消成 II,右面的 II 跟着做同样的初等行列变换,这样 II 最后的结果就变成了 BB


矩阵快速幂

把快速幂原理应用到矩阵上就可以求 AkA^k

快速幂函数不变,把整型变成矩阵型 (struct) 即可。

注意重载矩阵乘法运算符。

时间复杂度 Θ(n3logk)\Theta(n^3 \log k)

优化递推(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

如果要快速求 fif_i 的值,其中 ff 表示斐波那契数列,那么可以用矩阵快速幂的方法。

由于 fi=fi1+fi2f_i = f_{i - 1} + f_{i - 2},所以可以通过下面的方法求解 fif_i

定义两个 2×22 \times 2 的矩阵 FFMM。其中 M=[0111]M = \begin{bmatrix}0 & 1\\1 & 1\\\end{bmatrix}FF 初始为 [f1f200]\begin{bmatrix}f_1 & f_2\\0 & 0\\\end{bmatrix}

FF 更新成 FFMM 的乘积,即 F=[f1×0+f2×1f1×1+f2×10×0+0×10×1+0×1]=[f2f300]F = \begin{bmatrix}f_1 \times 0 + f_2 \times 1 & f_1 \times 1 + f_2 \times 1\\0 \times 0 + 0 \times 1 & 0 \times 1 + 0 \times 1\\\end{bmatrix} = \begin{bmatrix}f_2 & f_3\\0 & 0\\\end{bmatrix},那么此时我们就得到了 f3f_3 的值。

同理,如果再次 FF×MF \leftarrow F \times M,我们也可以得到 f4f_4 的值。那么如果要得到 fnf_n 的值只需要计算 F×Mn2F \times M^{n - 2} 即可,那么最后就有 fn=F1,2f_n = F_{1, 2}

这样我们就把求斐波那契数列的 Θ(n)\Theta(n) 的复杂度降到了 Θ(logn)\Theta(\log n),是十分优秀的。

这样我们就把一个递推问题通过矩阵快速幂的形式进行了优化,同理对于一些其它的递推式也是可以通过类似的方法优化。


数学性质

  • mod\bmod 质数意义下 1n11 \sim n - 1 逆元互不相同。

  • n=dnφ(d)n = \sum\limits_{d \mid n} \varphi(d)

  • 两个不同数的 gcd\gcd 不会超过两个数的差。

  • gcd(a,b)=1gcd(a+k×b,b)=1\gcd(a, b) = 1 \Longleftrightarrow \gcd(a + k \times b, b) = 1

  • Cnk=Cn1k1×nkC_n^k = C_{n-1}^{k-1} \times \dfrac nk

  • nn[0,1][0, 1] 随机变量的期望 kk 小是 kn+1\dfrac k{n + 1}

  • gcd(a1,a2,a3,,an)\gcd(a_1, a_2, a_3, \dots, a_n) 中,ij,a±aj\forall i \ne j,a\pm a_j 都不会对答案产生影响。

  • i=0kCn+r1r=Cn+kk\sum\limits_{i = 0}^k C_{n + r - 1}^r = C_{n + k}^k

  • Cnm=i=1mn+1iiC_n^m = \prod\limits_{i = 1}^m\dfrac{n+1-i}i

  • 卡特兰数:

    • h0=h1=1h_0 = h_1 = 1
    • hn=i=0n1hi×hni1=C2nnn+1h_n = \sum\limits_{i = 0}^{n - 1}h_i \times h_{n - i - 1} = \dfrac{C_{2n}^n}{n + 1}
  • AB=A+B1B\left\lceil \dfrac AB \right\rceil = \left\lfloor \dfrac{A+B-1}B \right\rfloor

Section 1. 最初的最初 - A+B Problem

Open

Problem Tried AC Difficulty
P2613  有理数取余 2 2 10
P5091  【模板】扩展欧拉定理 2 2 10
P3389  【模板】高斯消元法 4 2 10
P4783  【模板】矩阵求逆 6 2 10
P2455  [SDOI2006] 线性方程组 2 2 10
P1349  广义斐波那契数列 2 2 10
P2044  [NOI2012] 随机数生成器 1 1 10
P3216  [HNOI2011] 数学作业 1 1 10
 
Enrollees
5
Created By