给定一圆,上均匀分布有 (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;
}