P5206 [WC2019] 数树
Solution
下面记原题中的 \(y\) 为 \(m\)。只是为了好看。
Problem 1
记蓝树为 \(G_1 = (V, E_1)\),红树为 \(G_2 = (V, E_2)\)。
将两棵树取交,得到一个森林 \(G = (V, E_1 \cap E_2)\)。
由题易知,在 \(G\) 的同一棵树中,所有点的颜色相等。
\(G\) 中树的数量为 \(|V| - |E_1 \cap E_2| = n - |E_1 \cap E_2|\),因此第一问的答案为 \(m^{n - |E_1 \cap E_2|}\)。
开个 map 统计一下就行了。
Problem \(m = 1\)
数据给出了 \(m = 1\) 的部分分。
此时第一问的答案为 \(1\),后面两问的答案是一个最常规的无根树计数问题,由 Prufer 序列可知分别为 \(n^{n - 2}\) 和 \((n^{n - 2})^2\)。
Problem 2
先来直接枚举红树,写出答案的式子观察一下:
\[ans = \sum\limits_{E_2}m^{n - |E_1 \cap E_2|}
\]
记 \(S = E_1 \cap E_2\),考虑枚举 \(|S|\),统计出 \(f(x)\) 表示大小 恰好 为 \(x\) 的 \(S\) 的数量。
\[ans = \sum\limits_{x = 0}^{n - 1}f(x)m^{n - x}
\]
\(f(x)\) 看上去非常可以容斥的样子,这里也可以考虑用 二项式反演 来求:
记 \(g(x)\) 表示 钦定 \(E_2\) 中的 \(x\) 条边在 \(E_1\) 中出现:
\[g(x) = \sum\limits_{i = x}^{n - 1}\binom{i}{x}f(i) \iff f(x) = \sum\limits_{i = x}^{n - 1}\binom{i}{x}(-1)^{i - x}g(i)
\]
现在来求 \(g(x)\)。钦定 \(E_2\) 中的 \(x\) 条边在 \(E_1\) 中出现,相当于任意连 \(x\) 条边,形成 \(n - x\) 个连通块(树),再将这 \(n - x\) 个连通块用 \(n - x - 1\) 条边连成一棵树的方案数。
对于确定大小分别为 \(a_1, a_2, \cdots, a_{n - x}\) 的若干连通块,将它们连起来的方案数可以用 Prufer 序列求出。
将每个连通块看成一个缩点,枚举每个缩点的度数 \(d_i\),方案数为:
\[\sum\limits_{\sum\limits_{i = 1}^{n - x}(d_i - 1) = n - x - 2}\frac{(n - x - 2)!}{\prod\limits_{i = 1}^{n - x}(d_i - 1)!}\times \prod\limits_{i = 1}^{n - x}a_i^{d_i}
\]
换元,令 \(e_i = d_i - 1\),利用 多项式定理 化简:
\[\begin{aligned}
&\sum\limits_{\sum\limits_{i = 1}^{n - x}e_i = n - x - 2}\frac{(n - x - 2)!}{\prod\limits_{i = 1}^{n - x}e_i!}\times \prod\limits_{i = 1}^{n - x}a_i^{e_i + 1} \\
&= \prod_{i = 1}^{n - x}a_i\times \sum\limits_{\sum\limits_{i = 1}^{n - x}e_i = n - x - 2}\frac{(n - x - 2)!}{\prod\limits_{i = 1}^{n - x}e_i!}\times \prod\limits_{i = 1}^{n - x}a_i^{e_i} \\
&= \prod_{i = 1}^{n - x}a_i\times \left( \sum\limits_{i = 1}^{n - x}a_i \right)^{n - x - 2} \\
&= n^{n - x - 2}\prod\limits_{i = 1}^{n - x}a_i
\end{aligned}
\]
然后枚举被钦定的边集 \(E^{'} \subseteq E_1, |E^{'}| = x\):(\(a\) 数组仍然表示 \(G^{'} = (V, E^{'})\) 的连通块数量情况)
\[g(x) = n^{n - x - 2}\sum\limits_{E^{'} \subseteq E_1, |E^{'}| = x}\prod_{i = 1}^{n - x}a_i
\]
感觉不可做的样子。先不管,把上面已求得的所有东西往答案回代。推式子的时候注意到 交换求和次序 后可以运用 二项式定理 化简:
\[\begin{aligned}
ans &= \sum\limits_{x = 0}^{n - 1}f(x)m^{n - x} \\
&= \sum\limits_{x = 0}^{n - 1}\sum\limits_{i = x}^{n - 1}\binom{i}{x}(-1)^{i - x}g(i)m^{n - x} \\
&= \sum\limits_{i = 0}^{n - 1}g(i)\sum\limits_{x = 0}^{i}\binom{i}{x}(-1)^{i - x}m^{n - x} \\
&= \sum\limits_{i = 0}^{n - 1}g(i)m^{n - i}(1 - m)^{i} \\
&= \sum\limits_{i = 0}^{n - 1}m^{n - i}(1 - m)^{i}n^{n - i - 2}\sum\limits_{E^{'} \subseteq E_1, |E^{'}| = i}\prod_{j = 1}^{n - i}a_j \\
\end{aligned}
\]
看来必须要面对后面那坨东西了:一个比较靠谱的想法是对 \(1 \sim n\) 的每种连通块数求所有划分方案的权值总和。
但观察前面的系数的次数,是否可以化成一个常数的 \(n - i\) 次方,分配到每一个乘积项里,这样就省去了连通块数的限制呢?这是可行的:
\[\begin{aligned}
ans &= \sum\limits_{i = 0}^{n - 1}m^{n - i}(1 - m)^{(i - n) + n}n^{(n - i) - 2}\sum\limits_{E^{'} \subseteq E_1, |E^{'}| = i}\prod_{j = 1}^{n - i}a_j \\
&= \frac{(1 - m)^n}{n^2} \sum\limits_{i = 0}^{n - 1} \left( \frac{mn}{1 - m} \right)^{n - i} \sum\limits_{E^{'} \subseteq E_1, |E^{'}| = i}\prod_{j = 1}^{n - i}a_j \\
&= \frac{(1 - m)^n}{n^2} \sum\limits_{i = 0}^{n - 1}\sum\limits_{E^{'} \subseteq E_1, |E^{'}| = i}\prod_{j = 1}^{n - i}\left(\frac{mn}{1 - m}a_j \right) \\
\end{aligned}
\]
于是只需求所有划分方案的权值总和:并且需要在 \(O(n\log{n})\) 甚至线性的时间复杂度下解决。
值得一提的是,现在可以明白了为什么数据要给出了 \(m = 1\) 的部分分。
---分割线---不会了---
考虑组合意义,后面的式子表示在每个连通块内任选一个点的 带权方案数。
记 \(dp[u][0/1]\) 表示 \(u\) 的子树中,\(u\) 所在的连通块是否已经产生贡献(即是否已经选择了一个点)。
转移的时候就看当前点是否被选。这样每个点都在每个连通块内作为被选点,因此所有情况都被考虑到。
关于 \(u\) 的子节点 \(v\) 向 \(u\) 的转移:
\[\begin{aligned}
dp[u][1] = dp[u][1] \times dp[v][1] + dp[u][1] \times dp[v][0] + dp[u][0] \times dp[v][1] \\
dp[u][0] = dp[u][0] \times dp[v][0] + dp[u][0] \times dp[v][1]
\end{aligned}
\]
初始值分别为 \(dp[u][0] = 1\) 和 \(dp[u][1] = \frac{nm}{1 - m}\)。
Problem 3
直接上。交换求和次序 以寻求机遇。
\[\begin{aligned}
ans &= \sum\limits_{E_1}\sum\limits_{E_2}m^{n - |E_1 \cap E_2|} \\
&= \frac{(1 - m)^n}{n^2}\sum\limits_{E_1}\sum\limits_{i = 0}^{n - 1}\sum\limits_{E^{'} \subseteq E_1, |E^{'}| = i}\prod_{j = 1}^{n - i}\left(\frac{mn}{1 - m}a_j \right) \\
&= \frac{(1 - m)^n}{n^2}\sum\limits_{i = 0}^{n - 1}\sum\limits_{|E^{'}| = i}\prod_{j = 1}^{n - i}\left(\frac{mn}{1 - m}a_j \right)\sum\limits_{E^{'} \subseteq E_1}1 \\
\end{aligned}
\]
思考挂在最后的 \(\sum\limits_{E^{'} \subseteq E_1}1\) 是什么意义:包含 \(E^{'}\) 的 \(E_1\)(一棵完整的树)的数量。
咦?怎么这么熟悉?不就是之前推过的 Prufer 序列的结论吗?就是把 \(n - i\) 个连通块用 \(n - i - 1\) 条边连成一棵树的方案数啊。
继续:
\[\begin{aligned}
ans &= \frac{(1 - m)^n}{n^2}\sum\limits_{i = 0}^{n - 1}\sum\limits_{|E^{'}| = i}\prod_{j = 1}^{n - i}\left(\frac{mn}{1 - m}a_j \right) n^{n - i - 2}\prod\limits_{j = 1}^{n - i}a_j \\
&= \frac{(1 - m)^n}{n^4}\sum\limits_{i = 0}^{n - 1}\sum\limits_{|E^{'}| = i}\prod_{j = 1}^{n - i}\left(\frac{mn^2}{1 - m}a_j^2 \right) \\
\end{aligned}
\]
这个边集 \(E^{'}\) 成光杆司令了,实在是抽象。
直接考虑把 \(n\) 个点分成 \(x\) 个连通块的贡献:
\[\begin{aligned}
ans = \frac{(1 - m)^n}{n^4}\sum\limits_{x = 1}^{n}\prod_{j = 1}^{n - i}\left(\frac{mn^2}{1 - m}a_j^2 \right) \\
\end{aligned}
\]
上式中的一个 \(a\) 对应了多种划分方案(有标号)。
这是我最喜欢的小毬 放盒问题(有标号,盒非空,并注意断句),且每个大小为 \(w\) 小盒里的 每棵生成树 产生 \(\frac{mn^2w^2}{1 - m}\) 的乘积贡献。\(w\) 个点可以产生 \(w^{w - 2}\) 棵生成树(Prufer 序列经典结论),故一个大小为 \(w\) 的小盒可以产生 \(w^{w}\frac{mn^2}{1 - m}\) 的乘积贡献。
---分割线---不会了---
上生成函数了。
记 \(F(x) = \sum\limits_{k > 0}k^{k}\frac{mn^2}{1 - m}\frac{x^k}{k!}\)。
利用 exp 的意义:有标号元素划分为任意个非空子集的总方案数。
这里已经把一个子集的方案数求得,那么 \(G(x) = \exp(F(x))\) 就是用这些生成树组成森林的方案数。
\[ans = \frac{(1 - m)^{n}}{n^4}n![x^n]G(x)
\]