矩阵树定理这玩意背一次忘一次,还是写一发吧。
前置知识:行列式求值
给定一个矩阵,定义一个 \(n\) 阶矩阵 \(A\) 的行列式为 \(\det A=\sum_{p} (-1)^{\pi(p)} \prod a_{i,p_i}\),其中 \(p\) 为一个 \([1,n]\) 的排列,\(\pi(p)\) 为排列 \(p\) 的逆序对数。
行列式中行和列是等价的,以下对行描述的定理对列也同样成立。
行列式的性质一大堆,这里只介绍跟 \(O(n^3)\) 求解行列式用到的性质。
定理 1:将第 \(j\) 行的所有元素乘 \(k\) 的结果加到第 \(i\) 行的对应元素上,行列式不变。
证明:
忘了
定理 2:交换矩阵的任意两行,行列式的符号发生改变。
证明:这相当于在原基础上交换了 \(p_i,p_j\),由于交换排列的任意两个元素,排列逆序对数的奇偶性发生改变,那么 \((-1)^{\pi(p)}\) 的符号也发生改变。
定理 3:上三角矩阵、下三角矩阵、对角矩阵的行列式等于主对角线上所有元素的乘积。
证明:对于这三个矩阵,只有当 \(p_i=i\) 时 \(a_{i,p_i}\) 才可能对答案有贡献,其他排列一定会乘上一个零导致必然没贡献。
根据以上三个定理,我们可以通过高斯消元把矩阵化成上三角矩阵(这其实就是高斯消元在干的事……),于是就能在 \(O(n^3)\) 的复杂度内求出行列式。
一个小细节:高斯消元的时候若需要求模意义下的解,但是可能某些数在模给定模数意义下没有逆元,这个时候注意到我们只是想让当前主元所在列除了主对角线上的其他元素置为 0,我们考虑采取类似求 gcd 的“辗转相除”法,假设当前主元是 \(i\),要消去第 \(j\) 行的主元,我们考虑只通过将 \(a_j=a_j-a_i\times r\),其中 \(r=\lfloor\dfrac{a_{j,i}}{a_{i,i}}\rfloor\),之后 \(a_{j,i}\) 会变成 \(a_{j,i}\bmod a_{i,i}\),然后交换后重复执行上述流程直到 \(a_{j,i}\) 变为零,如果把 \(x\) 视为 \(a_{i,i}\),\(y\) 视为 \(a_{j,i}\) 的话,会发现这就是在对 \(x,y\) 做辗转相除法。由于矩阵的每个元素只会减小 \(\log\) 次,所以这部分复杂度是平方对数的,不是算法瓶颈,复杂度仍为三方。
【模板】行列式求值
矩阵树定理
问题引入:给定一张有向图,求以 \(r\) 为根的内向生成树数量。\(n\le 300\)。
定理内容:
定义 \(D\) 为该图的度数矩阵,\(A\) 为该图的邻接矩阵,\(L\) 为该图的拉普拉斯矩阵,\(L_r\) 为 \(L\) 去掉第 \(r\) 行第 \(r\) 列的 \(n-1\) 阶子式。
其中 \(D_{i,i}\) 为 \(i\) 节点的出度大小,其他位置为零。\(A_{i,j}\) 为从 \(i\) 到 \(j\) 的边数,\(L=D-A\)。不难发现自环的情况在相减的时候被抵消了。
则以 \(r\) 为根的内向生成树数量为 \(\det L_r\)。
证明:
参考:here
将 \(L_r\) 用定义式展开:
考虑给这个东西赋一个组合意义。让 \(L_{i,i}\) 表示从 \(i\) 出发任选一些出边的方案数,\(-L_{i,j}(i\neq j)\) 表示从 \(i\) 出发经过一条边到 \(j\) 的方案数,则 \(\prod L_{i,p_i}\) 可以视作对除了根节点 \(r\) 以外的其他点选择一条出边的方案数,带系数。不难发现,一个方案形成一个合法生成树当且仅当方案连出来的图不存在环。
考虑容斥,我们钦定某些点构成若干个环(\(p_i\neq i\)),剩下的点任意(\(p_i=i\)),那么一个方案的容斥系数为 \((-1)^{枚举的环数}\)。那么这个系数是否等于 \((-1)^{\pi(p)}\) 乘上 \(L_{i,p_i}\) 的 \(-1\) 的积呢?
引理:排列的逆序对数的奇偶性等于 \(n\) 减去排列所形成的环数的奇偶性。这里的“环数”指的是 \(i\rightarrow p_i\) 连边所形成的环数,包含自环。
证明:对于每一个环,设其长度为 \(m\),我们可以通过 \(m-1\) 次操作(交换两个数)使该环上所有元素都归位(即 \(p_i=i\)),也就是说,我们可以通过 \(n\) 减去环数次操作(每个环都省一次操作)将原排列归位。每次操作会使逆序对奇偶性改变。
根据如上引理,我们有 \((-1)^{n-1-包含自环的环数}=(-1)^{\pi(p)}\),而这个环数等于自环数+枚举的环数,于是我们有 \((-1)^{n-1}=(-1)^{\pi(p)}(-1)^{自环数}(-1)^{枚举的环数}\)。设 \(p_i\neq i\) 的数量为 \(cnt\)(即 \(L_{i,p_i}\) 贡献的 \(-1\) 数量),则自环数等于 \(n-1-cnt\),则 \((-1)^{n-1}=(-1)^{\pi(p)}(-1)^{n-1-cnt}(-1)^{枚举的环数}\),而众所周知 \((-1)^k=\dfrac{1}{(-1)^k}\),把等号右侧前两项除过去有 \((-1)^{\pi(p)}(-1)^{cnt}=(-1)^{枚举的环数}\),证毕。
矩阵树定理的拓展/变式
例题 0:给定一张无向图,求生成树个数。\(n\le 300\)。
题解:无向图生成树计数本质上和有向图生成树计数一样,因为无向边等价于两条有向边。而由于是无向图,所以以谁为根、内向还是外向树都不重要,随便钦定一个根即可。外向树计数本质也相同,只需要将原图边反向做内向树计数即可。较为平凡。
例题 1(P6178 【模板】Matrix-Tree 定理):给定一张有向带权图,求以 \(1\) 为根的外向树的所有生成树权值之和。生成树的权值定义为树上所有边的权值的乘积。\(n\le 300\)。
题解:考虑将权值为 \(w_i\) 的边拆成 \(w_i\) 条无权边,和原问题相同,跑矩阵树定理即可。实际上这就是矩阵树定理的带权形式,只不过 \(D_{i,i}\) 的值修改为 \(i\) 为起点的边权之和,\(A_{i,j}\) 的值修改为 \(i\) 到 \(j\) 的所有连边的边权之和。生成树计数是带权矩阵树定理的无权版本(当边权都为 \(1\) 时求出的是生成树数量)。
例题 2(P6624 [省选联考 2020 A 卷] 作业题):给定一张带权无向图,求所有生成树权值之和。生成树的权值定义为树上所有边的权值的最大公约数和总和的乘积。\(n\le 30,w_i\le 152501\)。
题解:对后面的那一大坨 \(\gcd\) 应用欧拉反演(公式:\(n=\sum_{d|n} \varphi(d)\))得:\(\sum_{T}(\sum w_i\times \sum_{d|\gcd(w_i)}\varphi(d))= \sum_{d}\varphi(d)\sum_T\sum w_i\times [d|w_i]\),枚举 \(d\),考虑把边权是 \(d\) 的倍数的那些边拎出来做矩阵树定理,问题转化为求所有生成树的边权和之和。但我们发现矩阵树定理只能求生成树边权积之和。对多项式熟悉的同学不难发现这实际上就是 \(1+w_i x\) 的卷积的一次项系数(也可以这么考虑,枚举每条边,计算包含这条边的生成树个数,考虑选出这条边的一次项,和剩下边的常数项相乘即可得到我们想要的结果,也可以考虑多项式乘法在这题上的组合意义)。时间复杂度 \(O(n^3\max w)\),但由于跑不满所以能过。
例题 3(P5296 [北京省选集训2019] 生成树计数):给定 \(n\) 个点的无向带权完全图,求出其生成树权值的 \(k\) 次方之和,对 \(998244353\) 取模。\(n\le 30,k\le 30\)。
题解:考虑把 \(k\) 次方用二项式定理展开:\((w+w_i)^k=\sum_{l=0}^k\dbinom{k}{l}w^lw_i^{k-l}\),发现它不能很好的写成多项式卷积的形式,考虑把组合数进一步展开:\((w+w_i)^k=\sum_{l=0}^k\dfrac{k!}{l!(k-l)!}w^lw_i^{k-l}=k!\sum_{l=0}^k\dfrac{w^l}{l!}\cdot \dfrac{w_i^{k-l}}{(k-l)!}\),最终得出
我们成功的把式子化成了多项式卷积的形式,将 \(\dfrac{w^l}{l!}\) 视为多项式中 \(x^l\) 的系数,然后把这个多项式当做边权跑矩阵树定理即可。注意根据上述推导,最终求出来的结果是 \(\dfrac{\sum w_i}{k!}\),需要把答案乘 \(k!\) 才是最终答案。这个东西似乎有个名字叫二项式卷积?
由于 \(k\) 只有 \(30\),所以我们并不需要什么 FFT NTT 之类的科技,直接 \(O(k^2)\) 卷积、求逆即可。时间复杂度 \(O(n^3k^2)\)。
BEST 定理
问题引入:给定一张欧拉图,求该图的本质不同欧拉回路个数。本质不同即两种方案不循环同构。\(n\le 100\)。
定理内容:
\(\operatorname{ans}=T\times \prod (out_i-1)!\),其中 \(out_i\) 是 \(i\) 点的出度,\(T\) 是该图生成树数量。
证明:
不会。
未完待续。