「CF917D」Stranger Trees

Description

Link:CF917D

给出一棵大小为 nn 的树。

对于每个 kk (0kn10 \leq k \leq n - 1),你需要求出有多少个大小为 nn 的带标号树与原树有恰好 kk 条重合的边。答案对 109+710^9 + 7 取模。

数据范围:1n1001 \leq n \leq 100

时空限制:11s / 250250MiB。

Solution

扩展 Cayley 公式:对于一个包含 nn 个点 mm 条边的森林,设其有 kk 个连通块,大小分别为 s1,s2,,sks_1, s_2, \cdots, s_k,则可以使得森林变成树的加边方式恰有

nk2i=1ksin^{k - 2}\prod_{i = 1}^k s_i

考虑钦定原树中的 ii 条边(则会产生 nin - i 个连通块)已经被选进生成树时的方案数为 cnt(i)\mathrm{cnt}(i)恰好原树的 ii 条边被选进生成树的方案数为 g(i)g(i)。则有

cnt(i)=j=in1(ji)g(j)    g(i)=j=in1(1)ji(ji)cnt(j)\mathrm{cnt}(i) = \sum\limits_{j = i}^{n - 1} \binom{j}{i} g(j) \iff g(i) = \sum\limits_{j = i}^{n - 1} (-1)^{j - i} \binom{j}{i} \mathrm{cnt}(j)

于是可以考虑先求出 cnt\mathrm{cnt} 再反演出 gg

注意到 i=1kai\prod_{i = 1}^k a_i 不太好直接处理。Trick:每个部分大小的乘积等于每个部分各选出一个元素的方案数

考虑 dp,设 f(u,i,0/1)f(u, i, 0/1) 表示考虑到了 uu 的子树,已经选出了 ii 个连通块,且 uu 所在的连通块 暂未 / 已经 选出一个点的方案数。枚举 uu 的每一个儿子 vv,有转移

  • 不合并连通块

f(u,i+j,0)+f(u,i,0)f(v,j,1)f(u,i+j,1)+f(u,i,1)f(v,j,1)f'(u, i + j, 0) \gets_{+} f(u, i, 0) \cdot f(v, j, 1) \\ f'(u, i + j, 1) \gets_{+} f(u, i, 1) \cdot f(v, j, 1)

  • 合并连通块

f(u,i+j1,0)+f(u,i,0)f(v,j,0)f(u,i+j1,1)+f(u,i,1)f(v,j,0)f(u,i+j1,1)+f(u,i,0)f(v,j,1)f'(u, i + j - 1, 0) \gets_{+} f(u, i, 0) \cdot f(v, j, 0) \\ f'(u, i + j - 1, 1) \gets_{+} f(u, i, 1) \cdot f(v, j, 0) \\ f'(u, i + j - 1, 1) \gets_{+} f(u, i, 0) \cdot f(v, j, 1)

于是 cnt(i)=f(1,ni,1)nni2\mathrm{cnt}(i) = f(1, n - i, 1) \cdot n^{n - i - 2}

时间复杂度 O(n2)\mathcal{O}(n^2)