ZJOI2018 树
ZJOI2018 树
给定 \(n,k\),按照如下规则生成随机树:
- 对于 \(i\ge 2\),\(i\) 的父亲 \([1,i)\) 中随机。
求生成 \(k\) 棵树全部同构的概率。
\(n\le 2000,k\le 10^9\)
Solution
首先我们将所有大小为 \(n\) 的等价类进行标号,设分别有 \(1\sim m\) 个,设其大小为 \(a_1\sim a_m\),则可知题意需要求的为:
我们不妨设 \(dp_n\) 表示 \(\sum_{i=1}^m a_i^k\)
考虑计算 \(dp_n\),事实上他存在另一个组合解释,即所有树生成概率相同,随机 D \(k\) 次,D 出来的树均相同的概率。
我们考虑将根节点拿去,转为考虑森林的情况,区别于传统计数问题,我们无法轻易的计算答案,因为此处的森林是无序的。
我们考虑按照此规则生成森林:
- 每次将最大的一批树拿去,然后转为 sub-problem
不妨设 \(tmp_{i,j}\) 表示当前所有树的大小均不超过 \(i\),所有树的大小之和为 \(j\) 的情况下的贡献。
那么 \(dp_{i}=tmp_{i-1,i-1}\)
我们枚举大小为 \(i\) 的树的数量(显然因为同构内部需要相同)由于是无标号同构判定,我们给其任意的分配标号(注意有 \(k\) 轮):
只需要计算 \(f_{i,u}\) 表示仅由 \(u\) 棵大小为 \(i\) 的树组成的森林对答案的贡献之和。
这里需要注意的一点是,答案是无标号的,我们先来形式化的描述一下这个问题:
考虑这 \(u\) 棵树可以描述为 \(u\) 个元素构成的序列,设大小为 \(i\) 的树有 \(m\) 个等价类,大小分别为 \(a_1\sim a_m\),我们考虑答案可以描述为:
- 长度为 \(u\) 的序列,每个元素在 \([1,m]\) 中穷举,统计本质不同的序列的贡献之和,其中序列的贡献分成两个 Part,其一为标号的分配,其二为 \(a_i\) 的乘积。
我们先考虑标号的分配:我们现在有 \(i\times u\) 个标号,考虑分配标号的时候,看起来答案似乎就是:\(\binom{i\times u}{i,i,i,...i}\)
然而并不是,我们需要注意到假设两棵树同构,在此标号分配意义下会被判定为不同构。
换而言之同构的树,或者说相同的颜色,彼此之间的排布顺序应当是无序的,于是设第 \(i\) 种等价类出现了 \(c_i\) 次,答案应当为 \(\binom{i\times u}{i,i,i...,i}\frac{1}{(c_j)!}\)
于是外部的贡献为 \(\frac{(iu)!}{(i!)^u}\),此时需要注意到这类贡献会产生 \(k\) 次,于是标号分配处的贡献为 \(\frac{(iu)!^{k}}{i^{uk}}\)
我们将一个长度为 \(u\) 的序列设为元素 \(x\),并考虑通过群论的语言来描述答案,设 \(x\) 的轨道为 \(orbit(x)\),并为每个 \(x\) 设 \(\omega(x)=\frac{1}{\prod c_i!}\),则答案为:
由于每个元素附带了额外的权值,我们无法通过传统的 Polya/Burnside 定理来计算答案,我们考虑拓展 Burnside 定理:
考虑为每个置换赋予权值 \(w(p)\),并基于如下构造,设 \(fix(p)\) 表示置换 \(p\) 意义下的不动点集,我们使得:
成立,则答案可以描述为:(其中 \(G\) 为群的大小即 \(u!\)(不过在不确定的情况下可以设))
忽略前面的部分,答案转为:
显然,我们有观察,每个轮换的贡献是独立可乘的。那么对于每个轮换,设其大小为 \(\rho_j\),答案可以描述为:
事实是,第二个 Part 的式子我们从来没有计算过,此时我们需要扩充我们预处理的信息量,令:
\(dp_{i,o}\) 表示所有大小为 \(i\) 的树的等价类的 \(\sum a_i^{jk}\) 之和,则此时我们需要预先修正我们所有的计算式:
- 我们引入 \(tmp_{i,j,o}\) 并为此有:
- 我们修正 \(f_{i,u,o}\) 的计算式:
其中 \(\omega(x)=\frac{1}{\prod (c_j)!^{o}}\),类似的,我们可以为每个 \(o\) 构造 \(w(p)\)
考虑计算式:
- 注意 \(dp_{i,o}=tmp_{i-1,i-1,o}\)
不失一般性,我们考虑到 \(p\) 可以拆分为若干个轮换的和,我们不妨将 \(w(p)\) 定义为 \(\prod w(\rho_i)\)
则此时有:
考虑什么情况下 \(p\) 为 \(x\) 的不动点,显然可以将每个颜色拆开考虑,设第 \(i\) 种颜色数量为 \(c_i\),我们设 \(F_{x}\) 表示某种颜色有 \(x\) 个时的贡献,则此时有:
于是有:(\(G=u!\))
考虑到对置换的处理通常是枚举轮换,设大小为 \(i\) 的轮换有 \(t_i\) 个,则其对答案的贡献为 \(\frac{1}{t_i!i^{t_i}}\)(后面的贡献来自 \(\frac{(i-1)!}{i!}\)):
故
我们设 \(F_i(x)=\sum \frac{w(i)^jx^{ij}}{i^jj!}\),设 \(G_i(x)=\frac{w(i)x^i}{i}\),则 \(F_i(x)=e^{G_i(x)}\)
方便起见将之前的 \(x\) 统一改为 \(n\) 并用 \(x\) 代表形式幂级数,故有:
设 \(G(x)=\sum G_i(x)\) 即:
设 \(H(x)=\sum \frac{x^i}{i^{ok}}\),则 \(G(x)=\ln H(x)\)
此时,我们得到了每个轮换的 \(w(\rho)\)
接下来我们考虑计算 \(f_{i,u,o}\),根据转移有:
我们考虑拆分后式,平凡的,我们枚举每个置换的大小并考虑大小为 \(i\) 的置换被使用了 \(t_i\) 次,则有:
类似的,设 \(G_i(x)=\frac{w_o(j)dp_{i,jo}x^j}{j}\),则 \(e^{G_i}\) 可以表达单个后式,后式即 \(\prod e^{G_i(x)}=e^{G(x)}\),其中 \(G(x)=\sum \frac{w_o(j)dp_{i,j}x^j}{j}\)
我们有边界 \(tmp_{1,?,?}=1\),且有转移:
- \(dp_{i,o}=tmp_{i-1,i-1,o}\)
- 需要求得 \(dp_{n,1}\)
- 计算 \(tmp_{i,j,o}\)
- 计算 \(f_{i,u,o}\):
- 对于某个 \(o\) 预处理 \(w_o(i)\) 依此:
设 \(H(x)=\sum \frac{x^i}{i!^{ok}}\),则 \(G(x)=\ln H(x)\),其中 \(G(x)[x^i]=\frac{w_o(i)}{i}\)
- 转移 \(f_{i,u,o}\)
设 \(G_{i,o}(x)=\sum_j \frac{w_o(j)dp_{i,jo}x^j}{j}\),则 \(f_{i,u,o}=\frac{(iu!)^{ok}}{i!^{ouk}}\times \exp(G_{i,o}(x))[x^u]\)
最后,我们需要知道那些状态是有效的:
考虑到 \(f_{i,u,o}\) 满足 \(iu\le n\),同时计算其需要知道 \(dp_{i,uo}\) 对应着需要知道 \(f_{i-1,\frac{n}{i-1},uo}\)
对于 \(f(i,u,o)\) 会计算 \(dp(i,o\sim uo)\)
对于 \(dp(i,o)\) 会计算 \(f(i',j',o)\) 且有 \(i'j'\le i\)
显然三个维度的乘积始终小于 \(n\)
至此,我们计算 \(tmp\) 的复杂度为:
我们计算 \(f\) 数组的复杂度为:
我们计算 \(w_o(i)\) 的复杂度为:
总体复杂度 \(\mathcal O(n^2\log n)\)
tips:
暴力 \(\ln\)
暴力 \(\exp\)