专栏文章

详细揭秘:低秩矩阵分解与矩阵树定理极简证明

算法·理论参与者 4已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@mi3yxd67
此快照首次捕获于
2025/11/18 10:42
3 个月前
此快照最后确认于
2025/12/01 22:37
3 个月前
查看原文
低秩矩阵分解可用于解决特殊矩阵行列式求值,其中包括特殊图生成树计数问题。
回顾行列式的定义式:
det(A)=p1n(1)inv(p)i=1nAi,pi\det(A)=\sum_{p_{1\sim n}}(-1)^{\text{inv}(p)}\prod_{i=1}^nA_{i,p_i}
对于求解 det(A+B)\det(A+B) 的问题,根据行列式的定义式,拆开贡献有:
  • 选取一个集合 S{1,2,,n}S\sube\{1,2,\dots,n\}
  • iS\forall i\in S,将 Bi,B_{i,*} 替换为 Ai,A_{i,*}
  • det(A+B)\det(A+B) 的值等于所有子集 SS 得到的矩阵 BB' 的行列式之和;
如果其中 rank(A)\text{rank}(A) 为常数,则可以进行低秩矩阵分解:根据行列式基本性质,只有 SS 内行线性无关时才有可能做出贡献,此时明显有 Srank(A)|S|\le \text{rank}(A)

例:矩阵树定理的证明

证明:给定一张图,令 D,AD,A 分别为图的度数矩阵、邻接矩阵,则任意选定 xx 并删除 D,AD,A 中的第 xx 行、第 xx 列后,det(DA)\det(D-A) 等于该图生成树个数。
对于一条边 (u,v)(u,v),其贡献为一个只有四个点有值的矩阵 MiM_i,其 (u,u),(v,v)(u,u),(v,v) 上的值为 11(u,v),(v,u)(u,v),(v,u) 上的值为 1-1。显然 MiM_i 的秩为 11,而 DAD-A 就是 Mi\sum M_i,这适用低秩矩阵分解。
相当于对每个不等于 xx 的点选择了一条边,且这些边互不相同。考虑每种方案的贡献:
  • 如果选出了环,那么这些行加起来就是全零行,故对应贡献为 00
  • 如果没有任何环,那么考虑与 xx 相连的任意点 pp,其只能选择 (p,p)(p,p) 上的 11,因为 (p,x)(p,x) 被删去了,依此递推可以得到贡献为 11
可以非常轻松地拓展至带权、有向版本推论。

例:Determinant

给定整数 n,cn,c,求解 n×nn\times n 的矩阵 Ai,jA_{i,j} 的行列式: Ai,j={1,i=j0,ijjmodi=0c,otherwiseA_{i,j}=\begin{cases}1,&i=j\\0,&i\ne j\land j\bmod i=0\\c,&\text{otherwise}\end{cases}
998244353998244353 取模。
n109n\le 10^9
注意到 Ai,jA_{i,j} 里面不等于 cc 的位置很少,不妨令 A=B+CA=B+C,其中 CC 表示一个 n×nn\times n 的全 cc 矩阵, Bi,j={1c,i=jc,ijjmodi=00,otherwiseB_{i,j}=\begin{cases}1-c,&i=j\\-c,&i\ne j\land j\bmod i=0\\0,&\text{otherwise}\end{cases}
容易发现,BB 是一个上三角矩阵,CC 的秩为一。
由于 rank(C)=1\text{rank}(C)=1,于是考虑计算将 Bi,jB_{i,j} 中至多一行替换为全 CC 的行列式。
由于 Bi,jB_{i,j} 是上三角矩阵,在没有替换时必有 pi=ip_i=i。如果替换了第 kk 行,那么在排列上就会形成一个环,其中环上除了 kk 的每个结点的编号都是下一个结点的因数,可以发现,其带来的逆序对数量为环上点数减一。
考虑计算贡献,令 f(i)f(i) 表示替换第 ii 行的贡献,则有:
f(n)=c1c(1+dn,dnf(d))f(n)=\dfrac{c}{1-c}(1+\sum_{d|n,d\ne n}f(d))
后续优化可以移步完整题解查看。

例:能量场

给你一个长为 nn 的序列 a1na_{1\dots n},定义一条边 (u,v)(u,v) 的权值为 au+ava_u+a_v。对于一张图,定义其权值为包含的所有边的权值乘积。求所有 nn 个点的有标号基环树的权值之和。对 998244353998244353 取模。
n103n\le 10^3
考虑基环树把环缩起来就是一颗树,而树的权值乘积很自然就能想到矩阵树定理,我们不妨枚举哪些点在环上,我们可以 DP 求出这些点构成的环的权值和,然后将这些点缩起来(边权、度数相加)做一次矩阵树定理,为了方便我们可以将代表这个环的点删去。
我们需要求 det(DA)\det(D-A),其中 DD 只有对角线位置有值且 Di,i=nai+j=1najD_{i,i}=na_i+\sum_{j=1}^na_jAi,j=ai+ajA_{i,j}=a_i+a_j,不妨设 di=Di,id_i=D_{i,i}
可以观察到 AA 中任意三行线性相关。于是我们只需要考虑大小不超过 22SS
根据行列式的定义式,我们可以简单地将行列式求出:
  • S=0|S|=0i=1ndi\prod_{i=1}^nd_i
  • S=1|S|=12i=1naijidj-2\sum_{i=1}^na_i\prod_{j\ne i}d_j
  • S=2|S|=2i=1nj=i+1n(2aiajai2aj2)ki,kjdk\sum_{i=1}^n\sum_{j=i+1}^n(2a_ia_j-a_i^2-a_j^2)\prod_{k\ne i,k\ne j}d_k
后续优化可以移步完整题解查看。

思考:简单的生成树

给定两棵点数分别为 n,mn,m 的树 T1,T2T_1,T_2 ,再构造一个无向图 GGGG 包含 T1,T2T_1,T_2 的所有点、树边,且还包含所有跨越 T1,T2T_1,T_2 的点对所组成的边。
求无向图 GG 的生成树个数,对 109+710^9+7 取模。
n,m2×106n,m\le 2\times 10^6
本题虽有其它解法,不过请尝试使用低秩矩阵分解解决。
解答
在两棵树上分别断开若干条边,设形成的连通块点数分别为 a1p,b1qa_{1\sim p},b_{1\sim q}
问题转化为二分图生成树个数,左部点 ii 与右部点 jj 之间的边权为 aibja_i\cdot b_j
依旧对 det(DA)\det(D-A) 做低秩矩阵分解,其中 rank(A)=2\text{rank}(A)=2
经过简单的推导,可得到答案为: mp1nq1iaijbjm^{p-1}n^{q-1}\prod_{i}a_i\prod_j b_j
树形 DP 即可求解,时间复杂度 O(n+m)O(n+m)

思考:Odd Namori

给定一个长为 n1n-1 的序列 p2np_{2\sim n},求满足下列条件的有向图的权值和:
  • 每个顶点的出度都为 11
  • 图中不存在偶环。
  • 对于所有 i[2,n]i\in[2,n],图中不包含边 ipii \to p_i
一张图的权值定义为 2c2^c,其中 cc 表示该图中的环数。答案对 998244353998244353 取模。
n2×106n\le 2\times 10^6
提示:如何计算一张图的合法生成子图权值和
D,AD,A 分别为图的度数矩阵、邻接矩阵,则答案为 det(D+A)\det(D+A)
证明
仿照对矩阵树定理的证明。对于一条边 uvu\to v,其贡献为一个只有两个点有值的矩阵 MiM_i,其 (u,u),(u,v)(u,u),(u,v) 上的值为 11,同样适用低秩矩阵分解。
相当于对每个点选择了一条出边。考虑每种方案的贡献:
  • 如果选出了偶环,那么这些行在环上编号为奇数的减去在环上编号为偶数的即可得到全零行,故对应贡献为 00
  • 如果没有任何偶环,那么每个环都有两种方向可选择,故贡献为 2c2^c,符合题意。
解答
有了上面的结论,我们能轻松求解给定内向树的补图的答案。
记从 00 开始的深度序列为 d1nd_{1\sim n}
完全图对应的矩阵为 1+nI\textbf{1}+nI,其中 1\textbf{1} 为全 11 矩阵,II 为单位矩阵。而所求为 det(1+nIIA)\det(\textbf{1}+nI-I'-A),其中 II' 除了 (1,1)(1,1)00,其余位置均与单位矩阵相同,AA 为给定内向树的邻接矩阵。
求行列式的矩阵为三个部分的和:1\textbf{1}nIInI-I'A-A,其中 1\textbf{1} 的秩为 11。如果没有用 1\textbf1 替换任意一行,则每个点均只能选第二部分,贡献为 n(n1)n1n\cdot (n-1)^{n-1}
否则若替换第 ii 行,且第 ii 行选择列 jj,那么第 jj 行只能选择第三部分,即选择第 pjp_j 列。以此类推可以知道 jjii 的子树中,且不在 jij\to i 路径上的结点依旧只能选第二部分。由于 pi<ip_i<i,所以每跳一次同时会有来自 A-A1-1 贡献和来自逆序对的 1-1 贡献,即贡献抵消为 11
如果 i1i\ne 1,则贡献为 n(n1)n(djdi+1)1n\cdot(n-1)^{n-(d_j-d_i+1)-1};否则贡献为 (n1)ndj1(n-1)^{n-d_j-1}
可以轻易线性计算,时间复杂度 O(n)O(n)

评论

3 条评论,欢迎与作者交流。

正在加载评论...