luogu4430 小猴打架
Posted oier
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu4430 小猴打架相关的知识,希望对你有一定的参考价值。
假硕讲了个prufer编码和Caylay公式
我为了证明prufer编码没用
所以用矩阵树定理证明了Caylay公式
让我们用矩阵树定理推一波
首先这个小猴打架最后会打成一棵树,这棵树是N个点的完全图的生成树
所以用矩阵树定理
构建矩阵(N个点的完全图)
这是我们的邻接矩阵
(egin{vmatrix}0&1&1&cdots&1\\1&0&1&cdots&1\\1&1&0&cdots&1\\vdots&vdots&vdots&ddots&vdots\\1&1&1&cdots&0end{vmatrix})
然后是我们的度数矩阵
(egin{vmatrix}N-1&0&0&cdots&0\\0&N-1&0&cdots&0\\0&0&N-1&cdots&0\\vdots&vdots&vdots&ddots&vdots\\0&0&0&cdots&N-1end{vmatrix})
所以说我们的基尔霍夫矩阵是N*N的下面矩阵:
(egin{vmatrix}N-1&-1&-1&cdots&-1\\-1&N-1&-1&cdots&-1\\-1&-1&N-1&cdots&-1\\vdots&vdots&vdots&ddots&vdots\\-1&-1&-1&cdots&N-1end{vmatrix})
然后我们开始大力跑代数余子式
划掉第N行第N列的元素得到一个(N-1)*(N-1)的矩阵:
(egin{vmatrix}N-1&-1&-1&cdots&-1\\-1&N-1&-1&cdots&-1\\-1&-1&N-1&cdots&-1\\vdots&vdots&vdots&ddots&vdots\\-1&-1&-1&cdots&N-1end{vmatrix})
注意这个矩阵是(N-1)*(N-1)的
然后对这个矩阵进行各种初等变换(初等乱搞)(以下方法参考《线性代数》)
我们先让第一行成为所有(N-1)行的和(初等变换第三条)
(egin{vmatrix}1&1&1&cdots&1\\-1&N-1&-1&cdots&-1\\-1&-1&N-1&cdots&-1\\vdots&vdots&vdots&ddots&vdots\\-1&-1&-1&cdots&N-1end{vmatrix})
然后让第2~(N-1)行都加上第一行(初等变换第三条)
(egin{vmatrix}1&1&1&cdots&1\\0&N&0&cdots&0\\0&0&N&cdots&0\\vdots&vdots&vdots&ddots&vdots\\0&0&0&cdots&Nend{vmatrix})
消成了上三角矩阵(美滋滋)
所以行列式就是对角线元素相乘,有1个1,(N-2)个N
所以生成树个数为(N^{N-2})
然后
考虑生成树的每一条边
小猴打架可以按照任意的顺序
所以每一种生成树的产生顺序就是他的边的排列个数,
有((N-1))条边所以排列为((N-1)!)
所以最后答案是(N^{N-2}(N-1)!)
#include <bits/stdc++.h>
using namespace std;
#define p 9999991
long long n, ans = 1;
int main()
{
scanf("%lld", &n);
for (int i = 1; i <= n - 2; i++)
ans = ans * n % p * (i + 1) % p;
printf("%lld
", ans);
return 0;
}
让我们一起膜拜大佬林瑞堂@olinr
以上是关于luogu4430 小猴打架的主要内容,如果未能解决你的问题,请参考以下文章