复习心得 - 矩阵

· · 算法·理论

二维数组(?)

定义

一个 m\times n 个数构成一个矩阵 \text{A},或者 \text{A}_{\text{mn}}。

\text{A}=\begin{bmatrix} a_{11} & a_{12} & a_{13} & \dots & a_{1n}\\ a_{21} & a_{22} & a_{23} & \dots & a_{2n} \\ a_{31} & a_{32} & a_{33} & \dots & a_{3n} \\ \dots & \dots & \dots & \dots & \dots \\ a_{m1} & a_{m2} & a_{m3} & \dots & a_{mn} \end{bmatrix}

其中 (a_{ij})(或 (a_{ij})_{m\times n}) 是矩阵 \text{A} 的元素。

矩阵 +

就是直接加了。

注意 n 和 m 都要相等。

\text{A}_{32}=\begin{bmatrix} 1 & 1 & 4 \\ 5 & 1 & 4 \\ \end{bmatrix} \text{B}_{32}=\begin{bmatrix} 1 & 9 & 1 \\ 9 & 8 & 1 \end{bmatrix}

这时

\text{A}+\text{B}=\begin{bmatrix} 1+1 & 1+9 & 4+1 \\ 5+9 & 1+8 & 4+1 \\ \end{bmatrix}=\begin{bmatrix} 2 & 10 & 5 \\ 14 & 9 & 5 \\ \end{bmatrix}

矩阵加法满足交换律和结合律。

矩阵 -

这个不举例了,就是逆运算了。

数乘 · 不是矩乘!

\text{A}_{32}=\begin{bmatrix} 1 & 1 & 4 \\ 5 & 1 & 4 \\ \end{bmatrix}

这时

v\cdot\text{A}_{32}=\begin{bmatrix} v & v & 4v \\ 5v & v & 4v \\ \end{bmatrix}

矩阵数乘满足交换律、结合律和分配律。

矩阵转置

对角线翻折,记作 A^T。

\text{A}=\begin{bmatrix} 1 & 1 & 4 \\ 5 & 1 & 4 \\ \end{bmatrix}

这时

\text{A}^T=\begin{bmatrix} 1 & 5 \\ 1 & 1 \\ 4 & 4 \\ \end{bmatrix}

我们发现相当于 A_{ij}\to{A^T}_{ji}。

矩阵转置满足反身性、可乘性。(点乘、矩乘)

矩乘 *

在这个例子中,\text{A}_{np} 和 \text{B}_{pm} 是我们的两个矩阵。

具体的来说,就是:

\text{C}_{ij}=\sum _{k=1}^p\text{A}_{ik}\cdot\text{B}_{kj}

这个建议手玩。

矩阵结果就是:

\text{A}_{np}\ \text{B}_{pm}=\text{C}_{nm}

注意:这样定义的矩乘不满足 \text{AB}=\text{BA}。

但是满足:

初等变换(行)

列变换极其相似,这里省略。

  1. 对一整行乘上一个 val(val\in \text{R} 且 val\neq 0)
  2. 一行加上另一行。
  3. 交换两行。

对矩阵进行这些操作之一就是初等变换。注意到这个东西很像一次方程的消元,高斯消元法就是用这个东西。

特殊矩阵

\begin{bmatrix} 1 & 1 & 1 \\ {\color{red}0} & 1 & 1 \\ {\color{red}0} & {\color{red}0} & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & {\color{red}0} & {\color{red}0} \\ 1 & 1 & {\color{red}0} \\ 1 & 1 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 3 & 6 & 9 \\ \end{bmatrix} \begin{bmatrix} 1 & {\color{red}0} & {\color{red}0} \\ {\color{red}0} & 2 & {\color{red}0} \\ {\color{red}0} & {\color{red}0} & 9 \\ \end{bmatrix} \text{I}=\begin{bmatrix} 1 & {\color{red}0} & {\color{red}0} \\ {\color{red}0} & 1 & {\color{red}0} \\ {\color{red}0} & {\color{red}0} & 1 \\ \end{bmatrix}

矩阵快速幂

我们有一个递推式:

\begin{bmatrix} F_{n} & F_{n-1} & \dots & F_{n-k+1} \end{bmatrix}

我们要由

\begin{bmatrix} F_{n-k+1} & F_{n-k} & \dots & F_{n-2(k+1)} \end{bmatrix}

的矩阵推出来。

我们中间就需要一个转移矩阵。

\text{Base}=\begin{bmatrix} b_{11} & b_{12} & \dots & b_{1k} \\ b_{21} & b_{22} & \dots & b_{2k} \\ \dots & \dots & \dots & \dots \\ b_{k1} & b_{k2} & \dots & b_{kk} \\ \end{bmatrix}

我们发现这满足 \begin{bmatrix} F_{n-k+1} & F_{n-k} & \dots & F_{n-2(k+1)} \end{bmatrix}\times \text{Base}= \begin{bmatrix} F_{n} & F_{n-1} & \dots & F_{n-k+1} \end{bmatrix}。

然后我们直接快速幂就可以快速根据初始矩阵转移出答案 F_{n}。

斐波那契数列

由于下方只有构造矩阵有意义,所以只给出矩阵。

我们有一个目标的矩阵:

\begin{bmatrix} F_n & F_{n-1} \end{bmatrix}

我们一开始有一个初始的矩阵:

\begin{bmatrix} F_2 & F_{1} \end{bmatrix}= \begin{bmatrix} 1 & 1 \end{bmatrix}

我们怎么转移呢?

\text{Base}=\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}

即 F_{n}=1\times F_{n-1}+1\times F_{n-2},F_{n-1}=1\times F_{n-1}+0\times F_{n-2}。

斐波那契数列的和

即 s_n=\sum_{i=1}^nf_{i}。

偷懒者:我不推矩阵。

我们发现 s_n=2\times f_n+f_{n-1}-1。

为什么?我们拆!

\begin{aligned} f_n &= f_{n-1}+f_{n-2} \\ &= f_{n-2}+f_{n-2}+f_{n-3} \\ &= f_{n-2}+f_{n-3}+f_{n-3}+f_{n-4} \\ &= \dots \\ &= f_{n-2}+f_{n-3}+\dots+f_{3}+f_{3}+f_{2} \\ &= f_{n-2}+f_{n-3}+\dots+f_{3}+f_{2}+f_{2}+f_{1} \\ &= f_{n-2}+\dots+f_{2}+f_{1}+{\color{red}f_{2}} \\ &= s_{n-2}+{\color{red}1} \end{aligned}

所以 s_n=2\times f_n+f_{n-1}-1=s_{n-2}+1+f_{n-1}+f_{n}-1。

好的这是偷懒者,真是个好方法!

我们考虑普通人的解:

我们有一个目标矩阵:

\begin{bmatrix} F_{n+1} & F_{n} & S_{n} \end{bmatrix}

我们一开始有一个初始的矩阵:

\begin{bmatrix} F_2 & F_{1} & S_{1} \end{bmatrix}= \begin{bmatrix} 1 & 1 & 1 \end{bmatrix}

那么我们推一下目标矩阵:

\text{Base}=\begin{bmatrix} 1 & 1 & ? \\ 1 & 0 & ? \\ ? & ? & ? \end{bmatrix}

首先,我们发现求 F 不需要 S 参与,所以:

\text{Base}=\begin{bmatrix} 1 & 1 & ? \\ 1 & 0 & ? \\ {\color{gold}0} & {\color{gold}0} & ? \end{bmatrix}

然后,我们需要一个 S_{n-1} 和一个 F_{n},推出 S_{n},相当于:S_{n}=1\times F_{n}+0\times F_{n-1}+1\times S_{n-1} 所以:

\text{Base}=\begin{bmatrix} 1 & 1 & {\color{gold}1} \\ 1 & 0 & {\color{gold}0} \\ 0 & 0 & {\color{gold}1} \end{bmatrix}

这样,你就独立完成了推理。

图上路径数(迷路弱化版)

就是给你一个图,要求 u 到 v 的路上正好 k 条的路径数。

我们定义一个状态:f_{i} 表示结束到 i 点的路径数。

每一次矩阵乘法,都是对矩阵迭代的一次,那么具体 \text{Base} 怎么写呢?

我们注意到每一条边,都将是一个有效迭代,所以 \text{Base}_{uv} 就是边数。

有点过于简单了。

啊不对我怎么跑了 1000ms+,好慢。我们可以发现这个矩阵是稀疏矩阵。 然后我们直接用专属优化即可,即枚举顺序 i\to k\to j,其中一旦找到 a_{i,k}=0,就停止。我们就这样优化到了 250ms+。

CF1117D

为什么题目那么多 xht37 /jy

就是你每一次可以加 1 个或 m 个宝石,然后求出恰好有 n 个宝石的方案数。

容易列出

f_i=\begin{cases} 1 & {i=0} \\ 0 & {0<i<m}\\ f_{i-1}+f_{i-m} & {i\ge m} \end{cases}

的转移式子 XD,然后直接做。

对应的,我们可以推出所有 \text{A}_{ii}=1。

然后所有 $\text{Base}_{i+1,i}=1$。 结束!(?)