定理内容
过n个有标志顶点的树的数目等于 n ( n − 2 ) n^{(n-2)} n(n−2)。
定理证明
例题
思路:
n
为奇数的时候答案直接是零,若 n
为偶数;
容易得出匹配好后的方案数 (n-1)*(n-3)*...*1
,想想每个点配对一个后再对剩下的点做匹配操作;
匹配好之后将匹配好的两个点看成一个整体,共 d=n/2
个整体;
还需要对匹配图添加 d-1
条边使得其变成一个树,注意这里是在原来的点之间加边,而两个整体间有且恰有一个边,于是还需要乘的就 是 d 个顶点,带序号的不同的树的个数
,再乘上 4^(d-1)
即可。
代码
#include <cstdio>
#define Ha 998244353
#define N 1000005
long long S[N],ans,tmp;
// 快速幂 x^k
long long ksm(long long x, long long k)
{
if (k<=0) return 1;
long long ret=1;
for (; k; x=x*x%Ha,(k>>=1)) if (k&1)
ret=ret*x%Ha;
return ret;
}
void getS()
{
long long tmp=1;
S[0]=1;
for (int i=2; i<N; i+=2)
S[i]=S[i-2]*(i-1);
}
int main()
{
getS();
int n;
scanf("%d",&n);
if (n%2)
{
puts("0");
return 0;
}
ans=1;
for (int i=n; i; i-=2)
ans=ans*(i-1)%Ha;
tmp=ksm(n/2,n/2-2);
tmp=tmp*ksm(4,n/2-1)%Ha;
ans=ans*tmp%Ha;
printf("%lld\n", ans);
return 0;
}
``