QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: Anonymous

Posted at:

Last updated:

Back to Problem

O (n^2 log n)

官方 DP 的核心是逐次插点,复杂度约为 \(O(m(n+m)^2)\),玩得太差了。

下面给出一条更快的路线。

1. 把 DP 写成固定微分算子

令 \(L_0\) 为初始叶子数,\(I_0=n-L_0\)。把非叶子分为两类:已经指定儿子的 \(s\) 个,以及尚未指定儿子的 \(c\) 个。

定义生成函数

\[ F_t(x,y,z)=\sum f_{L,c,s}x^L y^c z^s. \]

每次插入新节点时:

  • 选择叶子:叶子数不变,新内部节点可以指定或不指定儿子。
  • 选择未指定的内部节点:可以指定新儿子,也可以继续不指定。
  • 选择已指定的内部节点:只能保留已有指定儿子。

综合三种情况,得到一个与时刻 \(t\) 无关的算子:

\[ \begin{aligned} \mathcal T={}&x(y+z)\frac{\partial}{\partial x}\\\ &+x(y+z)\frac{\partial}{\partial y} +xz\frac{\partial}{\partial z}. \end{aligned} \]

因此

\[ F_{t+1}=\frac1t\mathcal T F_t. \]

初始函数为

\[ F_n=x^{L_0}\prod_{v:d_v>0}(d_vz+y). \]

设

\[ P(r)=\prod_{v:d_v>0}(d_v+r). \]

最终答案仍然是

\[ \operatorname{Ans} =\int_0^1 F_{n+m}(x,0,1)\frac{dx}{x}. \]

这里的积分只是多项式积分,模意义下就是每一项 \(x^L\) 除以 \(L\)。

2. 用微分方程和 Lagrange 反演

因为 \(\mathcal T\) 是一阶微分算子,可以用它对应的流来计算:

\[ F_{n+m} =\frac{m!}{D}[\tau^m]F_n(X(\tau),Y(\tau),Z(\tau)), \]

其中

\[ D=n(n+1)\cdots(n+m-1), \]

而流满足

\[ X'=X(Y+Z),\quad Y'=X(Y+Z),\quad Z'=XZ. \]

从初始点 \((x,0,1)\) 出发,令 \(r=Y/Z\)。由于 \(X-Y=x\),可以化简为

\[ Z=e^r,\quad Y=re^r,\quad X=x+re^r, \]

其中

\[ r'=x+re^r,\qquad r(0)=0. \]

于是

\[ F_n(X,Y,Z) =(x+re^r)^{L_0}e^{I_0r}P(r). \]

现在令 \(w=1/x\),定义

\[ B_w(r)=1+wre^r, \]

\[ A_w(r)=\frac1r\int_0^r\frac{du}{B_w(u)}, \]

以及

\[ K_w(r)=B_w(r)^{L_0}e^{I_0r}P(r). \]

由 Lagrange–Bürmann 反演公式,

\[ [\tau^m]F_n(X,Y,Z) =\frac{x^{L_0+m}}m [r^{m-1}]K'_w(r)A_w(r)^{-m}. \]

记

\[ G(w)=[r^{m-1}]K'_w(r)A_w(r)^{-m}. \]

可以证明 \(G(w)\) 是次数不超过 \(m\) 的多项式。将其代回答案积分,得到最终公式:

\[ \boxed{ \operatorname{Ans} =\frac{(m-1)!}{D} \sum_{j=0}^{m} \frac{[w^j]G(w)}{L_0+m-j} } \]

这就把原先的逐步 DP 改成了一个多项式线性泛函的求值问题。

3. 不必展开 \(G(w)\)

这是实现快速算法的关键。

定义线性泛函

\[ \Lambda\left(\sum_{j=0}^m g_jw^j\right) =\sum_{j=0}^m\frac{g_j}{L_0+m-j}. \]

取 \(m+1\) 个互异点 \(w_i=i\),其中 \(0\le i\le m\)。令 \(\ell_i(w)\) 为对应的 Lagrange 插值基函数,并预处理

\[ \lambda_i=\Lambda(\ell_i). \]

由于 \(\deg G\le m\),有

\[ \boxed{\Lambda(G)=\sum_{i=0}^m\lambda_iG(i)}. \]

因此,只需计算 \(m+1\) 个数值 \(G(0),G(1),\ldots,G(m)\),完全不必显式构造二元多项式 \(G(w)\)。

每次求 \(G(w_i)\),只需在模 \(998244353\) 下进行长度 \(m+1\) 的一元形式幂级数运算:

  • 计算 \(P(r)\),截断到 \(r^m\),总共 \(O(nm)\)。
  • 计算 \(B_w^{-1}\),进而得到 \(A_w\)。
  • 计算 \(B_w^{L_0}\)、\(A_w^{-m}\),以及 \(K'_w\)。
  • 提取 \([r^{m-1}]K'_w A_w^{-m}\)。

用 NTT 配合快速形式幂级数的逆、对数和指数运算,每次求值需要 \(O(m\log m)\) 时间。插值权重的预处理只需 \(O(m^2)\)。

4. 复杂度比较

逐次插点 DP

\(O(m(n+m)^2)\)

算子 + 快速幂级数

\(O(nm+m^2\log m)\)

空间复杂度

\(O(m)\)

所以,当 \(n,m\) 同阶时,时间复杂度从 \(O(n^3)\) 降到了 \(O(n^2\log n)\)。

有两点需要注意:其一,只有使用快速形式幂级数运算时,才能获得这个渐进复杂度;若所有多项式乘法都用朴素算法,整体仍可能达到立方复杂度。其二,本题规模只有约 200,NTT 与插值的常数开销不小,这条路线未必比原 DP 的实际运行时间更短,但理论复杂度确实更优。

Comments

No comments yet.