首页 > 其他分享 >矩阵树定理 记录

矩阵树定理 记录

时间:2025-01-19 15:20:42浏览次数:1  
标签:记录 dfrac 定理 矩阵 生成 sum 环数

矩阵树定理这玩意背一次忘一次,还是写一发吧。

前置知识:行列式求值

给定一个矩阵,定义一个 \(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\) 用定义式展开:

\[\det L_r=\sum_{p} (-1)^{\pi(p)}\prod L_{i,p_i} \]

考虑给这个东西赋一个组合意义。让 \(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+w_i)^k}{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\) 是该图生成树数量。

证明:

不会。

未完待续。

标签:记录,dfrac,定理,矩阵,生成,sum,环数
From: https://www.cnblogs.com/dcytrl/p/18443269

相关文章

  • 费马定理以及逆元预处理
    #include<bits/stdc++.h>usingnamespacestd;staticconstintMOD=1000000007;//预先全局存放阶乘与逆阶乘的数组staticconstintMAXN=100000;//根据题意,n最多10^5longlongfact[MAXN+1],invFact[MAXN+1];//快速幂,用于求x^y%MODlonglongfastPow(lo......
  • 树莓派串口通信开发记录
    树莓派开发记录:开发系统及代码编辑软件安装1.通过安装软件RasperryPiImager实现系统镜像流程化烧写进SD卡2.在VScode官网选择相对应的基于树莓派ARM64或32架构的版本,下载相应的deb文件:sudodpkg-iDesktop/code_1.60.2-1632316275_armhf.deb(替换为自己的路径)3.在命......
  • 中值定理
    中值定理微分中值定理微分中值定理是一系列定理的统称,它们在函数的导数与函数值之间架起了一座桥梁,揭示了函数在某区间内的一些深刻性质费马引理若函数\(f(x)\)在可导点\(x_0\)处取极值,则\(f'(x_0)=0\)。理解:就好比一座山峰,当你站在山顶(极值点)时,此刻的切线是水平的(导数为0......
  • 1.19 CW 赛时记录
    前言听不懂了,看到故人了看题\(\rm{T1}\)串串像\(\rm{dp}\),做一下才知道\(\rm{T2}\)构构造造困难\(\rm{T3}\)听不懂了\(\rm{T4}\)看不懂了应该很困难放平心态多打部分分时间管控好,然后就是做题\(\rm{T1}\)能不能给一个好一点的样例?思路首先转化题意......
  • 【做题记录】2025刷题计划--线段树
    A.「SDOI2014」旅行给每个宗教开一棵线段树,树剖\(+\)线段树单点修改区间查询即可。Code#include<bits/stdc++.h>#definelllonglong#defineilinline#defineread(x){\ charch;\ intfu=1;\ while(!isdigit(ch=getchar()))\ fu-=(ch=='-')<<1;\ x=ch&1......
  • 学习记录-责任链模式验证参数
    学习记录-责任链模式验证参数1.什么是责任链模式责任链模式(ChainofResponsibilityPattern)是一种行为设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。这样,发送者无需知道哪个对象将处理请求,所有的处理对象都可以尝试处理请求或将请求传递给链上的下......
  • 再学欧拉之欧拉定理
    没错,本文的一切还是为了它——\(\varphi\)。欧拉定理内容若\(a,n\)互质,则有\(a^{\varphi(n)}\equiv1\pmodn\)。证明设小于\(n\)且与\(n\)互质的自然数集合(即\(n\)的剩余系)为:\(X:x_1,x_2,x_3,\dots,x_{\varphi(n)},P:p_1=a\timesx_1,p_2=a\timesx_2,\dots,p_......
  • WC 记录
    P1224:给定\(n\)个\(d\)维向量\(A_i\),判断存在\(i,j\)使得\(A_i\)与\(A_j\)的内积为\(k\)的倍数,构造方案。\(n\le10^5,d\le30,k\in\{2,3\}\)。题解:考虑\(k=2\)的情形。构造矩阵\(M=A_1|A_2|...|A_k\),\(E=M\cdotM^T\)那么\(A_i\)与\(A_j\)的内积等于\(E_{......
  • 记录一下双多控开关接法
    实际上双控就是单刀双掷开关,多控就是双刀双掷开关。多控里L1A+L1B是输入的俩个接上级出来的俩根线,LA和LB是反着的接上总有一路能通。输入俩通道输出俩通道所以可以无限串联。 具体如何接可以看正泰的教程:(图也是从这偷的),正泰除了贵倒是蛮好的。不过线头露出来一点点就行,别露出......
  • RK3588+linux系统下交叉编译开发记录
    基础开发路线先用树莓派验证交叉编译可行性,或者直接利用树莓派开发项目树莓派运算速度不足时考虑一下方案采用windows环境下vscode加cmake实现交叉编译,将可执行文件直接考入RK3588自带的debian系统运行采用套接字通信,可直接用linux下的网络库开发记录24/12/27T......