题目大意:求带标号 N 个点的生成树个数,两棵生成树相同当且仅当两棵树结构相同且边的生成顺序相同。c++
题解:学会了 prufer 序列。
prufer 序列是用来表示带标号的无根树的序列。
每种不一样类型的带标号无根树会对应惟一的一个prufer序列。
生成方法:找到这棵树编号最小的叶子节点,将其相邻点加入到序列中,删掉这个点。重复这个过程直到树中只剩下两个点,此时获得的序列即为该树的 Prufer 序列。
性质:在原树中度数为 d 的点,在Prufer序列中出现了 d−1 次。spa
对于本题来讲,在生成树结构相同的状况下,共有 (n - 1)! 种加边顺序。另外,根据 Prufer 序列的性质,共有 \(n^{n - 2}\) 种不一样结构的生成树。所以,两部分的答案相乘便可。code
代码以下ci
#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; }