基础线代学习笔记

乱七八糟的简单线代

——简单线代的学习笔记

By Tuifei_oier

OI 中的线性代数实际上是以矩阵及其相关理论为主,有时也涉及到向量等内容,因此总体来说内容不多,以应用为主。
本文大致从两方面入手,来总结一些线性代数的相关知识和技巧。

Part 1 矩阵及线性空间

以下内容前置知识:高斯消元,相信大家都会。

一些定义

首先,对于一个矩阵,有一个重要的工具叫做行列式,矩阵 \(A\) 的行列式可记作 \(|A|\),对于一个 \(n\times n\) 的矩阵 \(A\),它的行列式定义如下:

\[|A|=\sum_{p\in\sigma_n}(-1)^{inv(p)}\prod_{i=1}^nA_{i,p_i} \]

其中,\(p\) 为一个 \(n\) 的排列,\(inv(p)\) 为排列 \(p\) 的逆序对数。
由定义知:行列式有以下几个基本性质:

  1. 交换 \(A\) 的 两行/两列,行列式变为相反数;
  2. \(A\) 的某一行/列乘上一个数 \(k\),行列式变为原来 \(k\) 倍;
  3. \(A\) 的某一行每个树对应加上另外一行的值,行列式不变。

实际上,以上三种操作都可以等价为原矩阵 \(A\) 乘上了另一个矩阵,而对于行列式有一个定理: \(|A\times B|=|A|\times|B|\),因此求出所乘矩阵的行列式也可以证明。

求法

行列式有一个 \(O(n^3)\) 的人尽皆知的求法:
考虑行列式的定义,如果我们能够通过之前的三种操作使得行列式被转化成只有 \(A_{i,i}\) 处有值,而其他位置都 \(=0\) 的形式,那么我们在对它求行列式的过程中只有 \(1,2,..,n-1,n\) 这个排列 \(p\) 会对答案有贡献,因此我们只需记录每次对矩阵操作时对行列式的改变值(比如:交换两行),在将其转化成上述形式后将对角线上的值全部乘起来即可得到原矩阵行列式。不难发现这就是高斯消元的过程,直接高斯消元就可以了。
实际上,只需将原矩阵消成上三角形式,这时同样只有排列 \(1,2,..,n\) 会有贡献。
复杂度 \(O(n^3)\)

矩阵求逆

给定矩阵 \(A\),我们定义 \(A^{-1}\) 表示 \(A\) 的逆矩阵,即满足:

\[A\times A^{-1}=I \]

\(I\) 即单位矩阵(对角线上为 \(1\),其他位置为 \(0\))。
实际上,通过上面的一些介绍,我们已经可以想到一个 \(O(n^3)\)\(A^{-1}\) 的算法。

因为对矩阵的三种操作都可以转化为我们将其乘上一个矩阵 \(B\),假设我们通过这些操作将其消成了一个单位矩阵,即:

\[A\times(\prod B)=I \]

\(\prod B\) 就是我们要求的 \(A_{-1}\)
于是我们在高消过程中,每对原矩阵 \(A\) 进行一次操作,我们就同步地对另一个矩阵 \(C\) 进行同样的操作;当 \(C\) 初始值为 \(I\) 时,最后得到的 \(C\) 矩阵即为答案。
复杂度 \(O(n^3)\)

线性空间与矩阵

对于一个行数列数相等的矩阵,我们有几个定义:

  • 秩:矩阵的最大的线性无关的行数。
  • 阶:矩阵的行数。
  • 线性无关:假设矩阵的某一行可以通过其他若干行表示(加加减减),则意味着它们是线性相关的,否则线性无关。

例如,对于矩阵:

\[\begin{bmatrix} 1\;0\;1\\ 1\;1\;0\\ 2\;1\;1 \end{bmatrix}\]

它的阶为 \(3\),秩为 \(2\)(第 \(3\) 行可以由第 \(1,2\) 行加起来得到)。
有了这两个概念,我们可以证明:当且仅当一个矩阵的秩小于阶,它的行列式为 \(0\)

事实上,对于一个秩和阶都为 \(n\) 的矩阵 \(A\),我们可以把它的每一行看作一个 \(n\) 维向量,而这 \(n\)\(n\) 维向量就可以唯一确定一个 \(n\) 维空间,而 \(n\)\(n\) 维向量对应的点所组成的 \(n\) 维凸包“体积”即为 \(|A|\)

BEST 定理

\(n\) 个点的有向图欧拉回路条数为以任意一个点的外向树形图个数乘上每个点度数 -1 的阶乘,即:

\[ec(G)=t_w(s)\prod_x(deg(x)-1)! \]

和 LGV 引理一样用途不是很广泛,一般针对特定题目。

LGV 引理

先给出定义
给定一张带权 DAG \(G\),给定两个顶点集合 \(V\) 的子集 \(A,B\)\(A\cap B=\varnothing,|A|=|B|=n\))。
定义 \(G\) 中的一条路径 \(P\) 权值 \(w(P)=\prod_{e\in P}w_e,f_{i,j}\)\(A_i\)\(B_j\) 的所有路径的权值和。
对于一个 \(n\) 的排列 \(\sigma\),定义一个 \(A\)\(B\) 的不相交路径 \(P_\sigma=(P_1,P_2,..,P_n)\)\(P_i\) 表示一条 \(A_i\)\(B_{\sigma_i}\) 的路径,且满足 \(P_1,P_2,...,P_n\) 两两没有公共点,\(P_\sigma\) 的权值定义为 \(\prod\limits_{i=1}^nw(P_i)\)

LGV 引理指出:
设矩阵:

\[C=\begin{bmatrix} f_{1,1}\ f_{1,2}\ ...\ f_{1,n}\\ f_{2,1}\ f_{2,2}\ ...\ f_{2,n}\\ ...\\ f_{n,1}\ f_{n,2}\ ...\ f_{n,n} \end{bmatrix}\]

\(|C|\) 为所有 \(A\)\(B\) 的不相交路径的带符号和。
\(|C|=\sum\limits_\sigma(-1)^{inv(\sigma)}w(P_\sigma)\)

这个引理一般应用在题设条件明显指出不相交路径这一要求时,一般对原图稍作修改就可以了。

余子式与伴随矩阵

定义 \(M_{i,j}\) 为将矩阵 \(A\) 删去第 \(i\) 行,第 \(j\) 列后的行列式值,则称 \(M_{i,j}\) 为矩阵 \(A\) 的余子式。
定义 \(C_{i,j}=(-1)^{i+j}M_{i,j}\),则称 \(C_{i,j}\) 为矩阵 \(A\) 的代数余子式(无符号的余子式)。
\(C_{i,j}\) 作为矩阵 \(M\)\(j\) 行第 \(i\)的值,则称矩阵 \(M\) 为矩阵 \(A\) 的伴随矩阵。

对于代数余子式,有这样一个式子:

\[\sum_{j=1}^nA_{i_1,j}C_{i_2,j}=\begin{cases} |A|,i_1=i_2\\ 0,otherwise \end{cases}\]

由这个式子我们可以得到:

\[A\times M=|A|\times I \]

因此,当 \(A\) 满秩时,我们可以用这种方式来 \(O(n^3)\) 求出 \(M\)

Part 2 应用

Pro A 高消解循环转移方程

对于一系列 DP 问题,有时会遇到转移方程互相依赖的情况,例如:

\[\begin{cases} f_i=Af_j+B\\ f_j=Cf_k+D\\ f_k=Ef_i+F \end{cases}\]

此时,我们不能直接递推地转移,但可以把 \(f_i,f_j,f_k\) 看成未知数,使用高斯消元解上述方程,从而得到 DP 值。

Pro B Turtles

给定一个 \(n\times m\) 的迷宫,在 \((1,1)\) 处有两只乌龟(本质相同),每只乌龟只能往下或往右走,迷宫中有的部分是空地,有的部分是障碍,求两只乌龟从 \((1,1)\) 走到 \((n,n)\) 且它们的行进路径不相交(不经过除了 \((1,1),(n,n)\) 以外的同一位置)的方案数。
\(tips:1\le n,m\le3000\)

我们考虑题中不相交这个条件,不难想到可以尝试使用 \(LGV\) 引理,考虑如何构造。
分析发现,我们可以构造 \(A=\{(1,2),(2,1)\},B=\{(n-1,n),(n,n-1)\}\),然后通过 DP 求出分别求出 \((1,2),(2,1)\)\((n-1,n),(n,n-1)\) 的路径条数,然后直接套用 LGV 引理即可。(注意这种情况下:如果两只乌龟的路径起终点不是 \((1,2)\rightarrow(n-1,n),(2,1)\rightarrow(n,n-1)\),则必然路径相交,因此 LGV 引理只会统计对应到达情况下的路径方案数,恰好为所求,因此可以使用。)

Pro C DZY Loves Games

给定一个 \(n\) 个点的图和 \(k\) 个关键点,求出对于 \(\forall i\ne j\in[1,k]\) 从关键点 \(i\) 出发随机游走 \(s\) 步(定义同上),不经过其他关键点而到达关键点 \(j\) 的概率。
\(tips:1\le n\le500,1\le k\le n\)

考虑如果没有关键点的限制而仅仅询问每两个点的答案,则我们显然可以快速地通过矩阵快速幂求出答案。
考虑加入关键点的限制,我们做如下转化:
考虑对于每个关键点,我们求出从其他每个点出发不经过其他关键点到达它的概率,则这个可以通过高斯消元得到。
然而,如果我们对每个关键点做一次高斯消元,复杂度会变为 \(O(n^4)\),考虑优化。
我们发现,如果我们把每个关键点拆成两个点,双向边拆为入边和出边,一个点只有出边、另一个点只有入边,相当于要求从 \(i\) 的出点走到 \(j\) 的入点的概率。
此时,对于不同的关键入点,在我们如果想求其他点走到它的概率而建立的方程组中,只有方程组最后一列的常数项会发生变化(对应于要求的是到哪一个入点的概率)。
于是在高消时可以同时解所有 \(k\) 个方程组,只需要把最后一列的常数项看成一个向量即可。
复杂度仍然为 \(O(n^3)\),最后矩阵快速幂求走 \(s\) 步的概率即可。

Pro D 凸包体积

给定 \(n\) 维空间内的 \(n+2\) 个点,保证每个点的每一维坐标 \(x_i\in\{0,1\}\),求这 \(n+2\) 个点的凸包的体积。
\(tips:2\le n\le35\)

考虑一个 \(n\) 维空间的凸包,它由 \(n+1\) 个点构成。
而如果要求这 \(n+1\) 个点的凸包的体积,实际上就是把它们写成 \(n+1\)\(n\) 维向量后矩阵形式后的行列式的绝对值。
如何在这道题中应用这个想法呢?我们考虑如果我们每次选出 \(n+1\) 个点,则我们可以得到它们的一个凸包,把这 \(n+2\) 种情况的凸包体积加起来除以 \(2\) 就是最终答案了。每个部分恰好在总答案加起来的和中出现了 \(2\) 次。

Pro E 欧拉回路计数

给定一个 \(n\) 个点 \(m\) 条边的无向连通图,每条边需要经过 \(t_i\) 次,求它的欧拉回路的数量。
\(tips:1\le n,t_i\le 1000,1\le m\le n\)

首先我们可以知道这是一个基环树。
对于树边,经过的 \(t_i\) 次一定是一半从上往下、一半从下往上,所以只需判断 \(2|t_i\)
对于环边,枚举其中一条边的分割方式(即几条从右往左、几条从左往右),剩下的环上边由于出度应等于入度而都可以直接确定,因此我们就可以把整张图变成有向图,BEST 定理即可。
复杂度 \(O(nt)\)

posted @ 2021-01-03 17:11  Tuifei_oier  阅读(503)  评论(0编辑  收藏  举报