Biological Software Utilities

题目
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)2n2种形态,然后每对节点之间有 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} 42n122n2n!n!(2n)2n2

#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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值