码迷,mamicode.com
首页 > 其他好文 > 详细

luogu4430 小猴打架

时间:2018-09-09 15:14:18      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:pre   线性   namespace   就是   邻接矩阵   print   ref   std   www   

假硕讲了个prufer编码和Caylay公式

我为了证明prufer编码没用

所以用矩阵树定理证明了Caylay公式

让我们用矩阵树定理推一波

首先这个小猴打架最后会打成一棵树,这棵树是N个点的完全图的生成树

所以用矩阵树定理

构建矩阵(N个点的完全图)

这是我们的邻接矩阵

\(\begin{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&0\end{vmatrix}\)

然后是我们的度数矩阵

\(\begin{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-1\end{vmatrix}\)

所以说我们的基尔霍夫矩阵是N*N的下面矩阵:

\(\begin{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-1\end{vmatrix}\)

然后我们开始大力跑代数余子式

划掉第N行第N列的元素得到一个(N-1)*(N-1)的矩阵:

\(\begin{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-1\end{vmatrix}\)

注意这个矩阵是(N-1)*(N-1)的

然后对这个矩阵进行各种初等变换(初等乱搞)(以下方法参考《线性代数》)

我们先让第一行成为所有(N-1)行的和(初等变换第三条)

\(\begin{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-1\end{vmatrix}\)

然后让第2~(N-1)行都加上第一行(初等变换第三条)

\(\begin{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&N\end{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\n", ans);
    return 0;
}

让我们一起膜拜大佬林瑞堂@olinr

luogu4430 小猴打架

标签:pre   线性   namespace   就是   邻接矩阵   print   ref   std   www   

原文地址:https://www.cnblogs.com/oier/p/9613038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!