题意
问有多少棵n个节点的树满足深度为奇数的点恰好有k个。
n≤500000n≤500000
分析
不难发现答案就是S(n−k,k)∗Ck−1n−1S(n−k,k)∗Cn−1k−1
其中S(n,m)S(n,m)表示一边有nn个点另一边有个点的二分完全图的生成树个数。
而又因为S(n,m)=nm−1∗mn−1S(n,m)=nm−1∗mn−1,然后这题就做完了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
typedef long long LL;
int n,k,MOD;
int ksm(int x,int y)
{
int ans=1;
while (y)
{
if (y&1) ans=(LL)ans*x%MOD;
x=(LL)x*x%MOD;y>>=1;
}
return ans;
}
int jc(int n)
{
int ans=1;
for (int i=1;i<=n;i++) ans=(LL)ans*i%MOD;
return ans;
}
int main()
{
scanf("%d%d%d",&n,&k,&MOD);
int ans=(LL)ksm(n-k,k-1)*ksm(k,n-k-1)%MOD*jc(n-1)%MOD*ksm(jc(k-1),MOD-2)%MOD*ksm(jc(n-k),MOD-2)%MOD;
printf("%d",ans);
return 0;
}