Description
有一棵\(n\)个点的树,假设有一个常数\(k(1\leq k\leq n)\),我们从树中任意选出\(k\)个点(这样的方案数显然为\(\binom{n}{k}\)) ,并且选出这\(k\)个点之外的尽可能少的原树点使得这些点和那\(k\)个点的导出子图联通(显然这样的方案唯一),我们称这个导出子图的总点数为这个方案的价值。
对于每个\(k(1\leq k\leq n)\),求出所有从树中选出\(k\)个点的方案的价值之和。
\(1\leq n\leq 200000\),答案模\(924844033\)输出。
Solution
ao秒啊,,,
如果考虑那个导出子图中点的贡献,是肥肠苦难滴。那么我们尝试转化成边的贡献。
注意到那个导出子图一定是一棵树,所以点数等于边数加一。那个加一最后做出的总贡献显然为\(\binom{n}{k}\),因此我们接下来考虑处理边的贡献就行了。
但直接考虑边的贡献还是不可做滴,所以考虑使用补集转换,用所有情况减去不做贡献的情况。不做贡献的话那么选出的\(k\)个点一定在那条边的两侧。因此对于每条边,如果其一侧的子树大小为\(a\),那么这条边对答案的贡献为\(\binom{n}{k} - \binom{a}{k} - \binom{n - a}{k}\)。
可是要对所有\(k\)都求一遍的话,全都DFS一遍非常的不现实。硬骨头在于减号后面的东西,其意义就是每一个边的一侧大小为\(a\),那么就要在总答案里减去一个\(\binom{a}{k}\)。因此我们考虑把每个边两侧的子树大小都放到一个桶\(b\)里,其中\(b_i\)表示大小为\(i\)的子树出现了多少次。那么最后答案要在\(n\binom{n}{k}\)的基础上减去一个: \[ a_k = \sum_{i = 1}^n b_i\binom{i}{k} \] 但是这个东西不好递推也不好卷积,我们尝试两边乘\(k\)再整理整理: \[ a_kk!=\sum_{i = 1}^n b_ii!\cdot\frac{1}{(i - k)!} \] 然而这还是一个不好递推也不好卷积的东西……但是我们采用一种传统艺能:把一个串反过来。因此我们定义\(c_i = \frac{1}{(n - i)!}\),这样原式就化成了: \[ a_kk!=\sum_{i = 1}^n b_ii!c_{n - i + k} \] 显然有\(n - i + k + i = n + k\),因此这个物事就可以卷积力,,,
但是模数除了是质数以外,好像题里面也没告诉别的。但是通过WolframAlpha可以发现这个模数减一之后是\(2^{21}\)的倍数,并且这个模数本身有一个原根为\(5\),所以是一个相当优秀的NTT模数。
Code
1 |
|