ZJOI2018 树
给定 (n,k),按照如下规则生成随机树:
- 对于 (ige 2),(i) 的父亲 ([1,i)) 中随机。
求生成 (k) 棵树全部同构的概率。
(nle 2000,kle 10^9)
Solution
首先我们将所有大小为 (n) 的等价类进行标号,设分别有 (1sim m) 个,设其大小为 (a_1sim 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_1sim a_m),我们考虑答案可以描述为:
- 长度为 (u) 的序列,每个元素在 ([1,m]) 中穷举,统计本质不同的序列的贡献之和,其中序列的贡献分成两个 Part,其一为标号的分配,其二为 (a_i) 的乘积。
我们先考虑标号的分配:我们现在有 (i imes u) 个标号,考虑分配标号的时候,看起来答案似乎就是:(inom{i imes u}{i,i,i,...i})
然而并不是,我们需要注意到假设两棵树同构,在此标号分配意义下会被判定为不同构。
换而言之同构的树,或者说相同的颜色,彼此之间的排布顺序应当是无序的,于是设第 (i) 种等价类出现了 (c_i) 次,答案应当为 (inom{i imes 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!)(不过在不确定的情况下可以设))
忽略前面的部分,答案转为:
显然,我们有观察,每个轮换的贡献是独立可乘的。那么对于每个轮换,设其大小为 ( ho_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( ho_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( ho))
接下来我们考虑计算 (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}} imes exp(G_{i,o}(x))[x^u])
最后,我们需要知道那些状态是有效的:
考虑到 (f_{i,u,o}) 满足 (iule n),同时计算其需要知道 (dp_{i,uo}) 对应着需要知道 (f_{i-1,frac{n}{i-1},uo})
对于 (f(i,u,o)) 会计算 (dp(i,osim uo))
对于 (dp(i,o)) 会计算 (f(i',j',o)) 且有 (i'j'le i)
显然三个维度的乘积始终小于 (n)
至此,我们计算 (tmp) 的复杂度为:
我们计算 (f) 数组的复杂度为:
我们计算 (w_o(i)) 的复杂度为:
总体复杂度 (mathcal O(n^2log n))
tips:
暴力 (ln)
暴力 (exp)