CF1172B Nauuo and Circle - 树形dp

给定一圆,上均匀分布有 \(n\) 个节点(不重合,从 \(1\)\(n\) 编号)。它们按照输入连成一棵树。求合法树的方案总数,对 \(998244353\) 取模。一棵树是合法的,当且仅当这棵树中无交叉的边(两边共用一端点除外)。

Solution

思路上类似树形 dp 吧

对于点 \(p\) 的子树,它在排列中必定是一段连续的区间,否则就会和其它的子树相交

不妨设 \(p_1=1\),设点 \(i\) 的度数为 \(d_i\),从根 \(1\) 开始,我们可以任意决定各个子树之间的顺序,然后递归下去

于是答案为 \(n \prod_{i=1}^n d_i!\)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;
const int mod = 998244353;

int n,t1,t2,d[N],frac[N],ans;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<n;i++) {
        cin>>t1>>t2;
        d[t1]++;
        d[t2]++;
    }
    frac[0]=1;
    for(int i=1;i<=n;i++) {
        frac[i]=frac[i-1]*i%mod;
    }
    ans=n;
    for(int i=1;i<=n;i++) (ans*=frac[d[i]])%=mod;
    cout<<ans<<endl;
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12632614.html
今日推荐