行列式
行列式
对于 \(n\times n\) 的方阵 \(A\),定义其行列式为:
其中 \(p\) 为所有 \(n\) 阶排列, $ \operatorname{sign}(p)$ 为 \(p\) 的逆序对个数。
1.行列式的性质
- 对于三角矩阵,其行列式为对角线上所有元素的乘积。
考虑哪些 \(A_{i,p_i}\neq 0\) 即可。
- 把矩阵 \(A\) 任意一行或一列乘以常数 \(k\) ,行列式变为 \(k\det(A)\)。
比较显然。
- 交换行列式任意两行或两列,矩阵的行列式变为 \(-\det(A)\)。
只需证明交换一个排列的两项,逆序对数的奇偶性恰好乘上 \(-1\)。
- 将某一行或列的所有元素乘上常数 \(k\) 之后加到另一行或列的对应元素上,行列式不变。
新的行列式等于原本行列式和另一个矩阵行列式的和,而另一个行列式显然为 \(0\)。
1.1 求矩阵行列式
考虑高斯消元的过程,发现只使用了交换两行以及把某一行的若干倍加上另一行的对应元素上的操作,前者每次行列式乘上 \(-1\),后者行列式不变,因此只需要知道消元结束的矩阵的行列式即可,而消元结束后变成上三角矩阵,因此可以直接乘起来。
复杂度 \(\Theta(n^3)\)。
1.2 上 Hessenberg 矩阵
- 定义: 对于 \(i>{j+1},A_{i,j}=0\) 的矩阵。
考虑第一行选择了第 \(x\) 列,那么对于 \(1\to x-1\) 列,它们选择哪一行就已经固定了,此时变成一个 行列都为为 \(n-x\) 的子问题。
设 \(f_i\) 表示后 \(i\) 行列的子问题,转移容易做到 \(O(n)\),总复杂度 \(O(n^2)\)。
1.3 求特殊矩阵行列式
对于 \(n\times n\) 的方阵 \(A,B\),\(\det(AB)=\det(A)\det(B)\)。
- 求矩阵 \(A_{i,j}=f(\gcd(i,j))\) 的行列式,其中 \(f(x)\) 是一个积性函数。
考虑构造三角矩阵 \(B,C\) 使得 \(B\times C=A\)。
考虑构造 \(B_{i,j}=[j|i]g(j),C_{i,j}=[i|j]\),其中 \(g(x)\) 也是一个积性函数。
那么
我们希望让 \(\sum\limits_{k|\gcd(i,j)}g(k)=A_{i,j}=f(\gcd(i,j))\),也就是 \(f(x)=\sum\limits_{d|x}g(d)\)。
由莫比乌斯反演可以得到 \(g(x)=\sum\limits_{d|x}f(d)\mu(x/d)\)。
那么 \(\det(A)=\det(B)\det(C)=\prod\limits_{i=1}^ng(i)\)。
例题 SP1772 DETER2 - Find The Determinant II
1.4 柯西–比内公式(Cauchy–Binet formula)
方阵的性质太好了,不过对于一般的矩阵也有类似的性质。
对于 \(n\times m\) 的矩阵 \(A\),\(m\times n\) 的矩阵 \(B(m\geq n)\),我们选取 \(\{1,2\dots m\}\) 的一个 \(n\) 元子集 \(S\),设 \(A_S\) 为 \(A\) 中的所有行以及下标在 $S $ 中的列构成的子矩阵,\(B_S\) 同理。
那么 \(\det(AB)=\sum_\limits{S}\det(A_S)\det(B_S)\)。
例题 LOJ3626 愚蠢的在线法官]
2.LGV引理(Lindström–Gessel–Viennot lemma)
对于一个有向无环图,边有权值,给定图上的 \(k\) 个起点和 \(k\) 个终点,对于一个 \(k\) 阶排列 \(p\) ,我们定义一组不相交路径为选出 \(k\) 条路径,满足第 \(i\) 条路径从第 \(i\) 个起点连向第 \(p_i\) 个终点,且所有路径不经过重复的点,其权值为经过的所有边的权值乘积。
一个排列 \(p_i\) 的权值定义为所有不相交路径组的边权和,记为 \(val(p)\)。
LGV 引理说的是,设 \(G_{i,j}\) 为从第 \(i\) 个起点到第 \(j\) 个终点的所有路径的边权乘积的和,那么
对于一组相交路径,我们考虑求出其字典序最小的一个交点,考虑其对应的两条路径 \(i\to p_i,j\to p_j\),那么我们变成 \(i\to p_j,j\to p_i\),那么就对应到了另一组相交路径,因此这是一组双射。
因为两组路径的符号相反,因此总贡献为 \(0\),证毕。
注意 LGV 引理并不能求出不相交路径个数,只能求出其带符号和。
例题 CF167E Wizards and Bets
完全的板子。
不过对于某些特殊情况,LGV 引理可以求出不相交路径个数。
练习 P7736 [NOI2021] 路径交点
例题【模板】LGV 引理
不妨把 \(a,b\) 都从小到大排序,那么容易证明合法的不相交路径一定满足 \(p_i=i\),而此时 \(\operatorname{sign}(p)=0\),故 \(\det\) 的值就是不相交路径数量。
例题CF348D Turtles
和上面一样。
例题 [ABC216H] Random Robots
考虑 \(x-t\) 图像,假如我们确定了每个机器人最终的位置,那么就变成了不相交路径计数,并且和上面一样的满足 \(p_i=i\),因此对于这样的行列式求和就是答案。
把行列式拆开,我们就是要给每个起点选一个终点,乘上符号再求和。
注意到值域不大,考虑从小到大依次确定每个最终位置,设 \(f_{S,j}\) 表示已经确定了终点的起点集合是 \(S\) 个最终位置,当前的位置是 \(j\),的符号和。
转移时考虑要不要把这个位置作为某个最终位置即可。
复杂度 \(\Theta(2^KKN)\)。
例题 P9041 [PA2021] Fiolki 2
考虑怎么判定一个 DAG 是否存在一组不相交路径。
选取大质数 \(P\),给每条边随机一个 \(P\) 以内的权值,这样有大概率 \(det(G)\neq 0\leftrightarrow\) 存在一组不相交路径。
\(\det(P)\neq 0\) 的条件就是所有向量线性无关,因此最多能选出的不相交路径数量就是矩阵的秩。
考虑对 \(r\) 扫描线,维护 \(f(l,r)\) 不同的位置,这是经典的带删除线性基的技巧,维护每个向量的插入时间,插入新的向量时如果比当前位置的向量插入时间考后就 swap。
复杂度 \(\Theta(nk^2+mk)\)。
例题 [LOJ6677]EntropyIncreaser与菱形计数
通过智慧的转化变成在墙角堆叠立方块的方案数,在根据高度不同转化成不相交路径计数。
此时直接使用 LGV 引理就可以做到 \(O(n^3)\),但是还可以继续推式子。
练习P8114 [Cnoi2021] 六边形战士
练习P8333 [ZJOI2022] 计算几何
3.矩阵树定理(Matrix-Tree Theorem)
3.1 无向图生成树计数
对于一个无向图 \(G\),定义其度数矩阵 \(D\)
定义其邻接矩阵 \(E_{i,j}=e_{i,j}\)。
其中 \(deg_i\) 为 \(i\) 的度数,\(e_{i,j}\) 为 \(i,j\) 之前的边的数量。
定义其 Laplace 矩阵 (Kirchhoff 矩阵)为 \(L_{i,j}=D_{i,j}-E_{i,j}\)。
设 Laplace 矩阵去掉任意一行一列的矩阵为 \(L'\),那么该图的生成树数量等于 \(\det(L')\)。
更进一步的,当边有权时,将 \(D,E\) 改为对应边的权值和,那么 \(\det(L')\) 求出的就是该图所有生成树的边权乘积之和。
练习P6178 【模板】Matrix-Tree 定理
练习P3317 [SDOI2014] 重建
练习[HEOI2015] 小 Z 的房间
例题[SHOI2016] 黑暗前的幻想乡
题目求的是有 \(n-1\) 种不同颜色的边构成的生成树数量。
换一种形式描述就是,选择一个大小为 \(n-1\) 的颜色集合,并要求这里面的颜色至少出现一次。
反过来容斥一下就是钦定若干颜色不出现。
每次跑矩阵树定理即可,复杂度 \(\Theta(2^nn^3)\)。
例题 [JSOI2008] 最小生成树计数
考虑 Kruskal 的过程,当考虑到边权为 \(w\) 的边的时候,边权 \(\leq w-1\) 的边已经缩成了若干连通块,而加入边权为 \(w\) 的边就是又缩起来若干连通块,对于每个这样的连通块跑矩阵树定理就行了。
例题 [ABC253Ex] We Love Forest
练习【UR #6】智商锁
练习 CF578F Mirror Box
3.2 有向图树形图数量
树形图分为 根向(所有边指向根)和 叶向(所有边指向叶子)。
定义入读、出度矩阵分别为 \(D^{in},D^{out}\),也就是把原本的度数矩阵改成入度数量或者出度数量。
定义 \(L^{in}=D_{in}-E\),\(L^{out}\) 类似,那么以 \(r\) 为根的根向树形图数量就是 \(\det(L^{out}(r))\),其中 \(L^{out}(r)\) 为 \(L^{out}\) 去掉第 \(r\) 行第 \(r\) 列的矩阵。
练习[CQOI2018] 社交网络
例题P4033 [Code+#2] 白金元首与独舞
把外界建成一个虚点,那么就是求以外界为根的内向树数量,暴力复杂度 \(\Theta((nm)^3)\)。
考虑只建出每个关键点沿着每个方向遇到的第一个关键点的边,就能过了。
3.3 生成树边权和
最暴力的做法是枚举每一条边计算在生成树中出现的次数,复杂度 \(\Theta(n^3m)\)。
考虑将一条边权为 \(v\) 的边权设为一个一次多项式 \(1+vx\),那么一棵树上边权乘积的一次项系数就是边权和。
需要维护一次多项式的加减乘除,复杂度 \(\Theta(n^3)\)。
例题[省选联考 2020 A 卷] 作业题
套路莫反之后就是变成求一个图的生成树边权和的形式,套用上面做法即可。
练习P5296 [北京省选集训2019] 生成树计数
3.4 BEST 定理
有向欧拉图的欧拉回路数量 = 以任意一点为根的向生成树数量 \(\times \prod\limits_{i}(deg_i-1)!\)。
练习【模板】BEST 定理 | Which Dreamed It
例题 P7531 [USACO21OPEN] Routing Schemes P
建立超级源点,超级汇点,连边之后判断有解的条件就是有欧拉回路。
使用 BEST 定理求出欧拉回路数量即可。
例题[AGC051D] C4
无向图欧拉回路计数是NPC,枚举一条边之后就变成有向图了。