二维数组(?)
定义
一个 \(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}\)。
但是满足:
- \((\text{AB})\text{C}=\text{A}(\text{BC})\)。
- \((\text{A}+\text{B})\text{C}={\color{red}\text{AC}}+{\color{red}\text{BC}}\)。
- \(\text{C}(\text{A}+\text{B})={\color{red}\text{CA}}+{\color{red}\text{CB}}\)。
初等变换(行)
列变换极其相似,这里省略。
- 对一整行乘上一个 \(val\)(\(val\in \text{R}\) 且 \(val\neq 0\))
- 一行加上另一行。
- 交换两行。
对矩阵进行这些操作之一就是初等变换。注意到这个东西很像一次方程的消元,高斯消元法就是用这个东西。
特殊矩阵
- 稀疏矩阵:非 \(0\) 元素比较少。可以优化乘法。
- 上三角:主对角线以下元素全为 \(0\),如
\[\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}
\]
- 对称矩阵:沿主对角线对称的元素。(满足 \(n=m\))
\[\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}
\]
- 单位矩阵:在对角矩阵的情况下, 对角线全是 \(1\)。
\[\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}
\]
- 这个东西的性质:\(\text{AI}=\text{A}\),就是怎么乘都不会变。特别的,对这个矩阵进行初等变换后的矩阵称为初等矩阵 \(\text{E}\)。
矩阵快速幂
我们有一个递推式:
\[\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}_{1m}=\text{Base}_{11}=1\)。
然后所有 \(\text{Base}_{i+1,i}=1\)。
结束!(?)
https://www.luogu.com.cn/article/04oe6lnp