CF1824B2

发布时间 2023-08-25 10:35:23作者: FOX_konata

原题

翻译

首先根据猜结论数学归纳法可以想到在\(k\)为奇数时答案依然是\(1\)

因此我们只考虑\(k\)是偶数的情况


方法1:

容易想到好点相当于这棵树上只考虑\(k\)个关键点的中心

则显然根据重心定义,我们枚举每个点为重心的情况,则对于他的每个儿子,我们可以用dp或者容斥原理来从中选出\(\leq \frac{k}{2}\)个点,这里重点说一下容斥原理

因为发现对于每个儿子最多有一个儿子内选的点的个数\(> \frac{k}{2}\),因此我们枚举是哪个儿子的子树选了这么多的点,可以得到答案\(\sum\limits_{(u,v) \in E}{\sum\limits_{i=\frac{k}{2}+1}^{k}{\binom{siz_v}{i} \binom{n-siz_v}{k-i}}}\)

这样我们就可以得到一个\(O(n^2)\)的做法,但这个做法显然不够优秀

我们考虑优化一下做法,显然\(dp\)是没法再优化的,因此我们考虑优化容斥

\(f_x=\sum\limits_{i=\frac{k}{2}+1}^{k}{\binom{x}{i} \binom{n-x}{k-i}}\)

观察\(f_x\)的组合意义,我们发现\(f_{x+1}\)相对与\(f_x\)多的部分实际上就是前\(x\)个数恰好选了\(i+1\)个,和前\(x\)个数选\(i\)个第\(x+1\)个数必须选的情况

因此可以得到\(f_{x+1} = f_x + \binom{x}{\frac{k}{2}} \binom{n-x-1}{k-\frac{k}{2}-1}\)

于是我们可以实现\(O(n)\)预处理\(O(n)\)计算,总复杂度\(O(n)\)


方法2:

首先可以证明好点一定对应树上的一个连通块,根据重心的定义,这是显然的(其实限制更严格,答案在树上是一条链,但这里不需要这么严格的限制)

我们考虑计算树上的点并不好算,但如果对于一条边\((u,v) \in E\)\(u\)\(v\)都是好点,则把边\((u,v)\)切开分成的两棵树中关键点的个数显然是一样的

而且由于答案在树上是一个联通快,我们可以通过联通块内边的个数+1得到联通快内点的个数

因此我们对于每条边考虑他左右两边各选\(\frac{k}{2}\)的方案数,答案即为:

\[\sum\limits_{(u,v)\in E}{\binom{siz_u}{\frac{k}{2}}\binom{n-siz_u}{\frac{k}{2}}} \]

同样可以做到\(O(n)\)