【洛谷P4430】小猴打架

题目大意:求带标号 N 个点的生成树个数,两棵生成树相同当且仅当两棵树结构相同且边的生成顺序相同。

题解:学会了 prufer 序列。
prufer 序列是用来表示带标号的无根树的序列。
每种不同类型的带标号无根树会对应唯一的一个prufer序列。
生成方法:找到这棵树编号最小的叶子节点,将其相邻点加入到序列中,删掉这个点。重复这个过程直到树中只剩下两个点,此时得到的序列即为该树的 Prufer 序列。
性质:在原树中度数为 d 的点,在Prufer序列中出现了 d−1 次。

对于本题来说,在生成树结构相同的情况下,共有 (n - 1)! 种加边顺序。另外,根据 Prufer 序列的性质,共有 (n^{n - 2}) 种不同结构的生成树。因此,两部分的答案相乘即可。

代码如下

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const LL mod = 9999991;

int main() {
	int n;
	cin >> n;
	LL ans = 1;
	for (int i = 1; i <= n - 1; i++) ans = ans * i % mod;
	for (int i = 1; i <= n - 2; i++) ans = ans * n % mod;
	cout << ans << endl;
	return 0;
}
原文地址:https://www.cnblogs.com/wzj-xhjbk/p/11673518.html