Crash 的文明世界 & JZPTREE & TREESUM 题解

发布时间 2023-08-08 21:35:38作者: User-Unauthorized

题意

给定一棵树,对于每个节点 \(u\),求 \(\sum\limits_{v = 1}^{n} \operatorname{dist}(u, v) ^k\),其中 \(\operatorname{dist(u, v)}\) 表示 \(u, v\) 两点间的距离。

题解

首先考虑化简算式中的 \(k\) 次幂,考虑使用斯特林数的性质:

\[n^k = \sum\limits_{i = 0}^{k} {n \choose i} \times i! \times {k \brace i} \]

所以可以化简原式

\[\begin{aligned} S(u) =& \sum\limits_{v = 1}^{n} \operatorname{dist}(u, v)^k \\ =& \sum\limits_{v = 1}^{n} \sum\limits_{i = 0}^{k} {\operatorname{dist}(u, v) \choose i} \times i! \times {k \brace i} \\ =& \sum\limits_{i = 0}^{k} i! \times {k \brace i} \sum\limits_{v = 1}^{n} {\operatorname{dist}(u, v) \choose i} \end{aligned}\]

\(\displaystyle f(u, i) = \sum\limits_{v = 1}^{n}{\operatorname{dist}(u, v) \choose i}\),那么我们可以得到

\[S(u) = \sum\limits_{i = 0}^{k} i! \times {k \brace i} \times f(u, i) \]

下面考虑如何求出 \(\displaystyle f(u, i)\),首先考虑子树的贡献,设 \(\displaystyle dp(u, i) = \sum\limits_{v \in \operatorname{subtree_u}}{\operatorname{dist}(u, v) \choose i}\),发现对于 \(\displaystyle y \in \operatorname{\operatorname{son_u}}, v \in \operatorname{subtree_u}\), 有 \(\operatorname{dist}(u, v) = \operatorname{dist}(y, v) + 1\),考虑转移式

\[\begin{aligned} dp(u, i) =& \sum\limits_{v \in \operatorname{subtree_u}}{\operatorname{dist}(u, v) \choose i}  \\ =& \sum\limits_{y \in \operatorname{son_x}} \sum\limits_{v \in \operatorname{subtree_y}} {\operatorname{dist}(u, v) \choose i} \\ =& \sum\limits_{y \in \operatorname{son_x}} \sum\limits_{v \in \operatorname{subtree_y}} {\operatorname{dist}(y, v) + 1 \choose i} \\ =& \sum\limits_{y \in \operatorname{son_x}} \sum\limits_{v \in \operatorname{subtree_y}} {\operatorname{dist}(y, v) \choose i} + {\operatorname{dist}(y, v) \choose i - 1} \\ =& \sum\limits_{y \in \operatorname{son_x}} dp(y, i) + dp(y, i - 1) \end{aligned}\]

上述的推导使用了杨辉三角的递推式:

\[{n \choose m} = {n - 1 \choose m} + {n - 1 \choose m - 1} \]

这样我们就可以从叶子节点向上更新出每个节点的 \(dp(u, i)\) 值了。接下来考虑求出 \(f(u, i)\) 的值,记 \(fa\)\(u\) 的父亲节点,发现对于 \(\displaystyle v \in \operatorname{subtree_u}\),有 \(\operatorname{dist}(u, v) = \operatorname{dist}(fa, v) - 1\);对于 \(v \notin \operatorname{subtree_u}\),有 \(\operatorname{dist}(u, v) = \operatorname{dist}(fa, v) + 1\),考虑转移式

\[\begin{aligned} f(u, i) =& \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(u, v) \choose i} + \sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(u, v) \choose i} \\ =& \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i} + \sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) + 1 \choose i} \\ =& \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i} - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i - 1} + \\ &\sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i} + \sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i - 1} \\ =& \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i} + \sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i} - \\ &\sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i - 1} + \sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i - 1} \\ =& \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i} + \sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i} + \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i - 1} + \\ &\sum\limits_{v \notin \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i - 1} - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i - 1} - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i - 1} \\ =& f(fa, i) + f(fa, i - 1) - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) \choose i - 1} - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i - 1} \\ =& f(fa, i) + f(fa, i - 1) - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist} (fa, v) - 1 \choose i - 1} - \\ &\sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i - 2} - \sum\limits_{v \in \operatorname{subtree_u}} {\operatorname{dist}(fa, v) - 1 \choose i - 1} \\ =& f(fa, i) + f(fa, i - 1) - 2f(u, i - 1) - f(u, i - 2) \end{aligned}\]

上述推导中均运用了杨辉三角递推式。利用推导出的转移式我们可以以 \(\mathcal{O}(nk)\) 的复杂度处理出 \(f(u, i)\) 的值,同时我们可以以 \(\mathcal{O}(k^2)\) 的复杂度预处理出需要的斯特林数,再代入 \(S(u)\) 的表达式即可求出答案,总复杂度为 \(\mathcal{O}(nk + k^2)\)

Code

出于篇幅考虑,代码放在云剪切板中。