「Codeforces 1097G」Vladislav and a Great Legend
Codeforces 1097G. Vladislav and a Great Legend
当时不会做
题意
给定一棵 $n$ 个点的树
对于每个非空的点集 $X\subseteq {1,2,\dotsc,n}$,定义 $f(X)$ 表示最少的能让点集 $X$ 联通的边的数量
求
$$
\sum_{X\subseteq {1,2,\dotsc,n},X\ne \varnothing} (f(X))^k
$$
模 $10^9+7$
$n\le 10^5,k\le 200$
做法
先考虑 $X$ 是树上一个联通子树的点集怎么做
令 $f_{i,j}$ 表示以 $i$ 为根的子树,选择了 $i$ 的所有方案的边数的 $j$ 次和
直接二项式展开,合并两个子树是 $\mathcal O(k^2)$ 的,总复杂度 $\mathcal O(nk^2)$ 无法通过此题
考虑令 $f_{i,j}$ 表示以 $i$ 为根的子树,选择了 $i$ 的所有方案的边数的 $j$ 阶下降幂的和
对于下降幂我们有
$$
\begin{align}
(x+1)^{\underline n} & = n! \binom{x+1}{n} \
& = n!\left(\binom{x}{n}+\binom{x}{n-1}\right) \
& = x^{\underline n} + n\times x^{\underline {n-1}}
\end{align}
$$$$
\begin{align}
(x+y)^{\underline n} & = n! \binom{x+y}{n} \
& = n! \sum_{i=0}^n \binom{x}{i} \binom{y}{n-i} \
& = n! \sum_{i=0}^n \frac{x^{\underline i}}{i!} \times \frac{y^{\underline {n-i}}}{(n-i)!} \
& = \sum_{i=0}^n \binom{n}{i} x^{\underline i} y^{\underline {n-i}}
\end{align}
$$
因此我们可以 $\mathcal O(k)$ 地加入一条边和 $\mathcal O(k^2)$ 地合并两个子树
总复杂度还是 $\mathcal O(nk^2)$ 的,无法通过
由于下降幂的性质,当以 $i$ 为根的子树中的点数不大于 $j$ 时,$f_{i,j}=0$
我们可以记 $size_i$ 表示以 $i$ 为根的子树的点数,每次合并严格 $\mathcal O(min{size_x, k}, min{size_y, k})$ 地合并两个子树 $x, y$,注意不能包含 $min{size_x,k}^2$
合并两个相邻子树 $x,y$ 时,我们选出 $x$ 的子树中 dfs 序最大的 $k$ 个点和 $y$ 的子树中 dfs 序最小的 $k$ 个点,这样每个点最多会对前后 $2k$ 个点形成贡献,于是总复杂度是 $\mathcal O(nk)$
最后用斯特林数
$$
x^k = \sum_{i=0}^k
\begin{Bmatrix} k \ i \end{Bmatrix}
x^{\underline{i}}
$$
复原出 $k$ 次幂和即可
接下来考虑不是联通子树的情况
定义叶子是联通子树上度为 $1$ 的点,可以发现一个联通子树需要计算 $2^a$ 次,其中 $a$ 是非叶子数量
统计 $i$ 处的答案时,若方案包含了至少两个 $i$ 的儿子, $i$ 就不是叶子,则需要乘系数 $2$,这可以全部计算,最后减去只含一个儿子的情况
做完 $i$ 之后,只要方案包含了至少一个儿子,由于 $i$ 的父亲必须选择,$i$ 就不是叶子,因此把除了 $i$ 单个点的方案都乘 $2$ 即可
代码
1 |
|
「Codeforces 1097G」Vladislav and a Great Legend