01
-
容斥意义 + Prufer 序列 + 树形 DP。部分参考了 tzc_wk 的文章。
-
题意:给定 \(n\) 个点的一棵树 \(T_1\),假设一棵 \(n\) 个点的树 \(T_2\) 和 \(T_1\) 共有的边为 \(x\),那么其价值就是 \(x2^x\)。求对于所有 \(T_2\) 的价值之和。
-
答案是 \(\sum|T_1\ \cap\ T_2| \cdot 2^{|T_1\ \cap \ T_2|}\),考虑对于每种树其价值如何使用容斥拆开。以及考虑最后如何使用 Prufer 序列解决问题。
-
首先考虑灵活运用容斥: \(f(S)=\sum\limits_{T\subseteq S}\sum\limits_{U\subseteq T}(-1)^{|T|-|U|}f(U)\)。首先试着证明这个式子是正确的。可以考虑 \(f(U)\) 的系数是否为 \([U=S]\)。
-
因为 \(U\subseteq T\subseteq S\),可以得到 \(T\) 是由 \(U\) 和 \(S\ \backslash U\) 的一个子集得到的。所以可以枚举这个子集的大小。
-
那么 \(U\) 的贡献就是 \(f(U)\sum\limits_{0\le i\le |S\ \backslash U|}(-1)^i\binom{|S\ \backslash U|}{i}=0^{|S\ \backslash U|}\cdot f(U)=[U=S]\cdot f(U)\),可知只有 \(U=S\) 时贡献为 \(1\)。
-
接着取 \(f(S)=|S|\cdot 2^{|S|}\),那么答案 \(P\) 就是推式子环节:
\[\begin{aligned}
P &= \sum _{T_2} \color{blue}{ f(T_1\ \cap T_2) }\\
&= \sum_{T_2}\color{blue}{\sum_{T\subseteq (T1\ \cap T_2)}} \color{black}{\sum_{U\subseteq T} (-1)^{|T| - |U|} f(U)} \\
&= (\sum_{T\subseteq T_1}\sum_{U\subseteq T} (-1)^{|T| - |U|}\color{blue}{f(U)}\color{black}{ ) \cdot (\sum_{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}\sum_{U\subseteq T} (-1)^{\color{blue}{|T| - |U|}} \cdot |U| \cdot 2^{|U|} ) \cdot (\sum_{T\subseteq T_2}1) \\
&= (\sum_{T\subseteq T_1}\sum_{U\subseteq T} \color{blue}{(-1)^{|T| + |U|}} \color{black}{ \cdot |U| \cdot 2^{|U|} ) \cdot (\sum_{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|}\sum_{U\subseteq T} \color{blue}{(-1)^{|U|} \cdot 2^{|U|}} \color{black}{{|U|})\cdot (\sum_{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|} \color{blue}{\sum_{U\subseteq T} (-2)^{|U|} {|U|}}\color{black}{)\cdot (\sum_{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|} \sum_{0\le i\le |T|}(-2)^i\cdot \color{blue}{i\cdot \binom{|T|}{i}}\color{black}{)\cdot (\sum_{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|}\sum _{0\le i\le |T|} (-2)^i \cdot |T|\cdot \binom{|T| - 1}{i-1})\cdot (\sum _{T\subseteq T_2}1) \\
\end{aligned}
\]
\[\begin{aligned}
P &= (\sum_{T\subseteq T_1}(-1)^{|T|}\sum _{0\le i\le |T|} (-2)^i \cdot \color{blue}{|T|}\color{black}{\cdot \binom{|T| - 1}{i-1})\cdot (\sum _{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|}\cdot |T|\color{blue}{\sum _{0\le i\le |T|} (-2)^i \cdot \binom{|T| - 1}{i-1}}\color{black}{)\cdot (\sum _{T\subseteq T_2}1)} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|}\cdot |T|\sum _{0\le i\le |T| - 1} \color{blue}{(-2)^{i+1}} \color{black}{\cdot \binom{|T| - 1}{i}\color{black}{)\cdot (\sum _{T\subseteq T_2}1)}} \\
&= (\sum_{T\subseteq T_1}(-1)^{|T|}\cdot |T|\cdot (-2)\color{blue}{\sum _ {0\le i\le |T| - 1} (-2)^i\cdot \binom{|T| - 1}{i} \cdot 1^{|T| - 1 - i}}\color{black}{)\cdot (\sum _{T\subseteq T_2}1)} \\
&= (\sum _{T\subseteq T_1} (-1)^{|T|}|T|(-2)(-1)^{|T| - 1})\cdot (\sum _{T\subseteq T_2}1) \\
&= \sum_{T\subseteq T_1}2|T|\sum_{T\subseteq T_2}1
\end{aligned}
\]
-
现在问题是 \(\sum\limits_{T\subseteq T_2} 1\) 是什么,它除了表示是否满足 \(T\) 的 \(\{V,E\}\) 是 \(T_2\) 的子集的 \(T\) 个数外,另外也表示了包含 \(T\) 的 \(\{V,E\}\) 的 \(T_2\) 的个数。
-
套用一下 Prufer 序列的推论,记 \(T\) 的联通块个数为 \(x\),那么生成树个数就是 \(n^{x-2}\prod\limits_{0\le i\le x}g(i)\),其中 \(g(i)\) 为 \(T\) 的第 \(i\) 个连通块的大小。
-
进一步拆答案:
\[\begin{aligned}
P &= \sum_{T\subseteq T_1} 2|T| \sum_{T\subseteq T_2} 1 \\
&= 2\sum_{T\subseteq T_1} |T| n^{x-2} \prod_{i = 1} ^ {x} g(i) \\
&= \frac{2}{n^2} \sum_{T\subseteq T_1} |T| \prod_{i=1}^{x} ng(i)
\end{aligned}
\]
-
相当于选择一个边集将这棵树分成若干个连通块,再从每个连通块中选择一个点,产生 \(n\) 的乘积贡献,最后从选定的边集中选择一条边,求贡献之和。
-
可以 DP。\(f_{u,0/1,0/1}\) 维护以 \(u\) 为根的子树内连通块的情况,\(u\) 所在连通块是否选择了点,\(u\) 子树是否选择了边的方案数个数,树上背包。
-
复杂度 \(O(n)\) 带超大常数。