题目
https://codeforces.com/gym/102956/problem/G
给一个 n n n,问有多少棵 n n n个节点的树满足完美匹配。
思路
首先两两配对,
n
n
n一定是偶数。另外每棵树只对应一种匹配方式,因为树的叶子节点一定选,选完后把多余的的边和点删掉,一直下去,这样每次选方案是唯一的。所以从配对方式考虑,那么
n
n
n个点两两配对的方案数是
n
!
2
n
2
n
2
!
\dfrac{n!}{2^{\frac{n}{2}}\frac{n}{2}!}
22n2n!n!
然后每一对节点之间随意连边构成树,根据
C
a
y
l
e
y
Cayley
Cayley公式有
(
n
2
)
n
2
−
2
(\frac{n}{2})^{\frac{n}{2}-2}
(2n)2n−2种形态,然后每对节点之间有
4
4
4种连边方式,最终公式为
4
n
2
−
1
n
!
2
n
2
n
2
!
(
n
2
)
n
2
−
2
4^{\frac{n}{2}-1}\dfrac{n!}{2^{\frac{n}{2}}\frac{n}{2}!}\big(\frac{n}{2}\big)^{\frac{n}{2}-2}
42n−122n2n!n!(2n)2n−2
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
ll qpow(ll a,ll b) {ll res=1;a%=mod;while(b) {if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
int main() {
int n;
cin>>n;
if(n&1){
cout<<0;
return 0;
}
if(n==2){
cout<<1;
return 0;
}
int m=n/2;
ll ans,ans1;
ans=ans1=1;
for(int i=1; i<=n; i++)
ans=ans*i%mod;
for(int i=1; i<=m; i++)
ans1=ans1*i%mod;
cout<<ans*qpow(qpow(2,n/2),mod-2)%mod*qpow(ans1,mod-2)%mod*qpow(4,n/2-1)%mod*qpow(n/2,n/2-2)%mod;
}