題目大意:求帶標號 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; }