【洛谷P4430】小猴打架

題目大意:求帶標號 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;
}
相關文章
相關標籤/搜索