Description
Link:CF917D
给出一棵大小为 n 的树。
对于每个 k (0≤k≤n−1),你需要求出有多少个大小为 n 的带标号树与原树有恰好 k 条重合的边。答案对 109+7 取模。
数据范围:1≤n≤100。
时空限制:1s / 250MiB。
Solution
扩展 Cayley 公式:对于一个包含 n 个点 m 条边的森林,设其有 k 个连通块,大小分别为 s1,s2,⋯,sk,则可以使得森林变成树的加边方式恰有
nk−2i=1∏ksi
考虑钦定原树中的 i 条边(则会产生 n−i 个连通块)已经被选进生成树时的方案数为 cnt(i),恰好原树的 i 条边被选进生成树的方案数为 g(i)。则有
cnt(i)=j=i∑n−1(ij)g(j)⟺g(i)=j=i∑n−1(−1)j−i(ij)cnt(j)
于是可以考虑先求出 cnt 再反演出 g。
注意到 ∏i=1kai 不太好直接处理。Trick:每个部分大小的乘积等于每个部分各选出一个元素的方案数。
考虑 dp,设 f(u,i,0/1) 表示考虑到了 u 的子树,已经选出了 i 个连通块,且 u 所在的连通块 暂未 / 已经 选出一个点的方案数。枚举 u 的每一个儿子 v,有转移
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−1,0)←+f(u,i,0)⋅f(v,j,0)f′(u,i+j−1,1)←+f(u,i,1)⋅f(v,j,0)f′(u,i+j−1,1)←+f(u,i,0)⋅f(v,j,1)
于是 cnt(i)=f(1,n−i,1)⋅nn−i−2。
时间复杂度 O(n2)。