Cayley + EGF + Stirling数 + 拉格朗日反演:ICPC2025西安H

Heart of Darkness - Problem - QOJ.ac
题目要求至少 k 条异色边,我们转化为求恰好 0,…,k−1 条异色边,然后用总方案去减。
Cayley 公式:
- n 个点带标号无根树:nn−2
- n 个点带标号有根树:nn−1
我们首先枚举 i 个黑点,然后它们组成一棵无根树,方案为:
i=1∑n(in)ii−2
现在我们考虑在上面挂白点
EGF :
a×b→a+b(aa+b)
Definition : A(x)=∑n=0∞an⋅n!xn
Then:
A(x)B(x)=i=0∑∞(i=0∑n(in)aibn−i)n!xn
我们定义 T(y),其中 [yn]T(y) 表示 n 个点有根树的方案:
T(y)=t=1∑∞tt−1t!yt
我们假设枚举有 z 条异色边,那样子就有 z 棵树。
现在我们先求在一个黑点上挂 z 棵树,它贡献到生成函数 [xz] 处:
z=0∑∞z!Tz(y)⋅xz=exT(y)
之所以要除 z!,是因为树之间没有差别。根据泰勒展开,上式为 exT(y)
而我们现在有 i 黑点,因此方案为:(exT(y))i,重新展开得到:
z=0∑∞z!Tz(y)iz⋅xz
现在我们本质上其实就是求这个东西:
j=0∑k−1i=1∑n(in)ii−2(n−i)![xjyn−i]z=0∑∞z!Tz(y)iz⋅xz
- j 枚举的是总共 j 条异色边
- 之所以乘 (n−i)!,是因为我们EGF要还原系数
- 前面 i 个黑点,所以我们需要 n−i 个白点,因此 y 的次数为 n−i
变形一下:
j=0∑k−1[yn−i]j!ijTj(y)i=1∑n(in)(n−i)!ii−2
显然,我们可以对黑点也用 [yi] 表示,那样子我们就可以直接在最外面提取 [yn] 了:
n![yn]j=0∑k−1j!Tj(y)i=1∑ni!ii+j−2yi
接下来我们来看看 T(y) 的另一种表示方式,注意 T(y) 是生成函数。显然 T(y) 肯定要有一个根节点,而下面可以连任意多个子树,因此有:
T(y)=yi=0∑∞i!Ti(y)=yeT(y)
我们现在有一个关于 T(y) 的函数:T(y)=yeT(y)
拉格朗日反演:
假设已知 y=f(x),我们现在想求其反函数 x=g(y) 的泰勒展开。
对于 y=f(x),我们必然可以写成:y=ϕ(x)x,这个时候我们有:
[yn]g(y)=n1[xn−1]ϕn(x)
另类拉格朗日反演:
如果我们要求的是复合函数,我们有:
[yn]F(T(y))=[xn]F(x)ϕn(x)(1−xϕ(x)ϕ′(x))
我们现在回过来看:T(y)=yeT(y),我们令 x=T(y),则 y=xe−x
根据定义有 ϕ(x)=ex,因此 ϕn(x)=enx,ϕ′(x)=ex
我们回到我们最开始想求的式子,我们直接让包括 T(y) 的这一大坨为 :
F(T(y))=j=0∑k−1j!Tj(y)i=1∑ni!ii+j−2yi
而我们现在恰恰就是要求 [yn]F(T(y)),直接套公式:
n![yn]F(T(y))=n![xn]enx(1−x)j=0∑k−1j!xji=1∑ni!ii−2+j(xe−x)i
令 A(x)=∑j=0k−1j!xj∑i=1ni!ii−2+j(xe−x)i ,令 A(x) 的系数 am=[xm]A(x)
在 m 固定的,显然我们可以知道我们要取 e−xi 的哪一项,先泰勒展开:
e−xi=l=0∑∞l!(−i)lxl
显然 l=m−i−j,原式变为:
am=j=0∑k−1j!1i=1∑ni!ii−2+j⋅(m−i−j)!(−i)m−i−j
进一步化简和变形,得到:
am=j=0∑k−1j!1⋅(m−j)!1i=1∑m−j(−1)m−j−i(im−j)im−2
第二类Stirling数:
{nk}=k!1i=0∑k(−1)k−i(ik)in
因此上式可以直接变为:
am=j=0∑k−1j!1{m−2m−j}
第二类Stirling数的性质:
对于 {m−2m−j} ,当 j 固定时,这是一个关于 m 的不超过 2j 次的多项式
因此多个斯特林数求和,得到的 A(x) 也是一个关于 m,次数不超过 2(k−1) 的多项式。
若 A(x) 为 d 次多项式,则其OGF的分母为 (1−x)d+1
因此我们可以表示为:
A(x)=(1−x)2k−1P(x)
其中 P(x) 是 O(k) 级别的,我们要求的最终式子变为:
n2k−2enxP(x)
我们考虑 P(x) 的计算:
P(x)=A(x)(1−x)2k−1
而 P(x) 是 O(k) 级别的,所以我们可以用 O(k2) 算出 A(x) 的前 k 项,然后和 (1−x)2k−1 卷积即可。
{nk}=k{n−1k}+{n−1k−1}
第二类Stirling数我们可以递推预处理,因此 am 我们就可以 O(k) 求出来了。
现在,我们就暴力枚举 P(x) 中的每一项 pi:
n!i=0∑2kpi[xn−i](1−x)2k−2enx
我们看后面这个,我们令其系数为 cm,我们现在想快速求 cn−i,令:
C(x)=m=0∑∞cmxm=(1−x)renx
求导:
C′(x)=m=1∑∞cmmxm−1=(1−x)2rnxenx(1−x)r−enxr(1−x)r−1(−1)=(1−x)renx⋅1−xn(1−x)+r=1−xn+r−nxC(x)
因此有:
(1−x)C′(x)=(n+r−nx)C(x)
左式:
(1−x)m=1∑∞cmmxm−1=m=1∑∞cmmxm−1−m=1∑∞cmmxm
右式:
(n+r)m=0∑∞cmxm−nm=0∑∞cmxm+1
我们提取 xm−1 的系数:
mcm−(m−1)cm−1=(n+r)cm−1−ncm−2
变形得到:
cm=mn+r+m−1cm−1−mncm−2
因此我们就可以用 O(n) 的时间把 cm 递推出来了
总时间复杂度 O(k2+n)