$Matrix-Tree$定理-题目

Posted shzr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$Matrix-Tree$定理-题目相关的知识,希望对你有一定的参考价值。

$Matrix-Tree$

  其实矩阵树的题挺好玩的,一些是套班子求答案的,也有一些题目是靠观察基尔霍夫矩阵性质推式子的。

  

  文艺计算姬:https://www.lydsy.com/JudgeOnline/problem.php?id=4766

  题意概述:求完全二分图的生成树数目。左部点的个数为n,右部为m,答案对p取模。$n,m,p<=10^{18}$

  好玩的题目!刚看到这个题的时候以为是一道板子题,看了一眼数据范围...对于完全二分图,基尔霍夫矩阵是非常有特点的(删掉最后一行最后一列),首先看对角线,前n行为m,后m-1行为n。右上角和左下角各是一个$ n imes (m-1)$的$-1$块。手动消元一番,发现答案是$n^{m-1}m^{n-1}$,但是消到下半部分只能靠找规律,没有严谨的证明。交上去虽然A了,但是总觉得这个做法不是很靠谱,于是又学了一种非常科学的方法:

  抛弃原始的按行消元,而是利用特殊的性质。将除第 $n$ 行以外的行加进第 $n$ 行里,此时第 $n$ 行变成这个样子:

  技术图片

  此时第 $n+1$ 行往下是长这个样子的:

  技术图片

  把之前消出来的那一行分别加到这些行里面,就只剩下绿色部分了,就像这样:

  技术图片

  问题是这个奇怪的矩阵的行列式怎么求啊?看一看最早的定义式:

  ${det(K)=}sum_{P}^{ };{(}{(-1)}^{ au{(P)}} imes{K}_{1,p1} imes{K}_{2,p2} imes{K}_{3,p3} imescdots imes{K}_{N,pN}{)}$

  显然每行每列只能选一个数出来,对于前 $n-1$ 列,如果选了 $n$ 行的1,第 $n$ 列就没得选了,所以如果想求有意义的答案,第 $n$ 行必然要选第 $n$ 个数,剩下每行的证明同理,所以这个矩阵的行列式求法等同于上三角矩阵,答案就是 $n^{m-1}m^{n-1}$ 有了准确的证明后感觉非常快乐.

  技术图片
 1 # include <cstdio>
 2 # include <iostream>
 3 # define ll long long
 4  
 5 using namespace std;
 6  
 7 ll n,m,p,ans=1;
 8  
 9 ll mul (ll a,ll b)
10 {
11     ll s=0;
12     while(b)
13     {
14         if(b&1LL) s=(a+s)%p;
15         a=(a+a)%p;
16         b>>=1LL;
17     }
18     return s%p;
19 }
20  
21 ll qui (ll a,ll b)
22 {
23     ll s=1;
24     while(b)
25     {
26         if(b&1LL) s=mul(a,s);
27         a=mul(a,a);
28         b>>=1LL;
29     }
30     return s%p;
31 }
32  
33 int main()
34 {
35     scanf("%lld%lld%lld",&n,&m,&p);
36     ans=mul(ans,qui(m,n-1));
37     ans=mul(ans,qui(n,m-1));
38     printf("%lld",ans);
39     return 0;
40 }
文艺计算姬

---shzr


以上是关于$Matrix-Tree$定理-题目的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理

BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)

bzoj 1002 [FJOI2007]轮状病毒 Matrix-Tree定理+递推

Matrix-tree定理 spoj HIGH

生成树计数 Matrix-Tree 定理

Matrix-Tree 定理(基尔霍夫矩阵树定理)