P5206 [WC2019] 数树

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) \]

posted @ 2023-07-16 07:27  Schucking_Sattin  阅读(40)  评论(0)    收藏  举报