首页 > 其他 > 详细

【ZJOI2018】 树

时间:2021-04-24 22:27:01      阅读:25      评论:0      收藏:0      [点我收藏+]

显然我们要求所有等价类大小的 \(k\) 次方和。

注意到有根树有很强的子问题结构,这引发我们考虑 dp。

\(f_i\) 表示 \(n=i\) 时的答案,则去掉根节点后变成了森林等价类计数。

考虑按子树大小从小到大加入,设 \(g_{i,j}\) 表示考虑到大小为 \(i\) 的子树,当前森林大小为 \(j\),则有转移方程:

\[g_{i,j}=\sum_{i\cdot d\le j}g_{i-1,j-i\cdot d}\cdot I_{i,d}\cdot\binom{j}{i\cdot d}^k \]

且有 \(f_i=g_{i-1,i-1},g_{1,*}=1\)

其中 \(I_{n,m}\) 表示带标号的 \(m\) 棵大小为 \(n\) 的树组成的森林等价类个数。

和 exp 一样,内部的标号并不是 \(\binom{m\cdot n}{n,n,\cdots,n}\),每个大小相同的等价类有 \(\frac{1}{size!}\) 的贡献。

\(m\) 棵子树的种类分布看成染色,则问题就转化成了等价类计数问题。考虑使用 Pólya 定理。

也即,每种颜色有一个权值,每种染色的权值是颜色的乘积的 \(k\) 次方,而我们要统计所有轨道的带权染色权值和

假设有 \(T_n=E_1\cup E_2\cup\cdots\cup E_\lambda\),则我们相当于有 \(\lambda\) 种颜色。颜色 \(j\) 对于一个长度为 \(i\) 的循环有 \((|E_j|^i)^k\) 的贡献,而一个置换的权值是循环分解后所有循环贡献的乘积。考察其整个结构,贡献是类似于笛卡尔积的形式。考虑用多元生成函数刻画,即设 \(f(t_1,t_2,\cdots,t_\lambda)=\sum_{i=1}^\lambda |t_i|^k\),再设 \(F(t_1,t_2,\cdots,t_\lambda)\) 表示答案,所求即为 \(F(|E_1|,|E_2|,\cdots,|E_\lambda|)\)。不妨先不考虑轨道的带权,则根据 Pólya 定理,作用在染色上的群是 \(S_m\)(代入 \(S_m\) 的循环指标)我们有

\[F(t_1,t_2,\cdots,t_\lambda)=Z_{S_m}(f(t_1,t_2,\cdots,t_\lambda),f(t_1^2,t_2^2,\cdots,t_\lambda^2),\cdots,f(t_1^m,t_2^m,\cdots,t_\lambda^m)) \]

我们就得到了答案关于 \(P_n(k),P_n(2k),\cdots,P_n(mk)\) 的贡献,其中 \(P_n(\delta)=\sum_{i=1}^\lambda|E_i|^\delta\)

事实上,置换就是循环的有标号无序组,因此直接对于 \(P\) 做一个多项式 exp 即可。

再考虑带权的问题。考虑广义 Burnside:

\[\sum_{O\in X/G}\omega(G_O)|O|=\sum_{g\in G}\omega(g)|X^g|,\text{where} \ \omega(G)=\sum_{g\in G}\omega(g) \]

现在我们知道 \(\omega(G)\) 的贡献系数,考虑通过类似反演的形式 ”凑”出某个置换的贡献系数(事实上,置换的贡献能拆成循环指标的形式,这样才可以将循环带权代入 Pólya 计算)。

对于一个轨道,设其包含了 \(k_i\)\(E_i\),则其贡献系数为 \(m! \prod_{i=1}^\lambda\frac{1}{\kappa_i!^{k}}\)(也即我们希望 \(\omega(G_0)|O|\) 成为的东西),又由于 \(|O|=\frac{m!}{\prod_{i=1}^\lambda\kappa_i!}\),所以 \(\omega(G_0)=\prod_{i=1}^\lambda\frac{1}{\kappa_i!^{k-1}}\)

现在我们要反推出一个置换的贡献。考察 \(G_0\) 的结构,不难发现 \(G_0=S_{\kappa_1}\times\cdots\times S_{\kappa_\lambda}\)。贡献系数又只与循环指标相关,而循环指标也是笛卡尔积的形式,从而有 \(\omega(G_0)=\omega(S_{\kappa_1})\times\cdots\times\omega(S_{\kappa_\lambda})\),因而进一步有 \(w(S_\kappa)=\frac{1}{\kappa!^k}\)

考虑循环的贡献 \(\chi_i\),不难发现这个贡献同样是 exp 的形式,也即令 \(f(i)=\sum_{i=1}^m \frac{\chi_ix^i}{i!}\\\),则有

\[\exp f(x)=1+\sum_{i=1}^m\omega(S_i)\frac{x^i}{i!}=\sum_{i=0}^m\frac{x^i}{(i!)^k} \]

反推只需要多项式 ln 即可。这样求出 \(\chi_i\) 的系数后,就可以使用 Pólya 再做一遍 exp 得到答案了。

注意到我们需要对于所有 \(n\cdot m\le ::n\) 求出 \(P(mk)\) 的值。但由于时间复杂度是倒数平方和的形式,这是 \(O(1)\) 的(似乎非常优),可以积分得到复杂度是平方的。

最后来描述一下整个算法的流程:从小到大枚举森林大小 \(i\),再枚举 \(j\),要对所有 \(i\cdot j\le n\) 计算 \(P_n(j\cdot k)\)。求出之后通过一次 exp 求出 \(I_{n,m}\)。循环的系数可以提前预处理。

【ZJOI2018】 树

原文:https://www.cnblogs.com/chefcurry/p/14697793.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!