题解:【集训队作业2018】count

两个序列同构当且仅当两个序列生成的笛卡尔树相同。所以我们要对序列能够生成的笛卡尔树计数。

为了方便,我们钦定相等元素左边更大,这样笛卡尔树就成了二叉树。

不难发现,笛卡尔树合法的条件是,其任意左链的长度 \(\le m\)

于是考虑 DP。设 \(f_{i,j}\) 表示左链长度 \(\le i\),有 \(j\) 个点的合法树个数,那么有转移:

\[f_{i,j}=\sum_{k=0}^{j-1} f_{i-1,k}f_{i,j-1-k} \]

直接做是 \(O(n^3)\) 的,考虑优化。下面介绍一种很厉害的 GF 做法。

设形式幂级数 \(F_i\) 满足 \([x^j]F_i=f_{i,j}\),那么卷积可以表示为:

\[F_i=F_{i-1}F_ix+1 \]

也就是:

\[F_i=\frac{1}{1-F_{i-1}x} \]

发现 \(F_i\) 可以表示为 \(\frac{a_i}{b_i}\) 的形式,考虑递推 \((a_i,b_i)\)

\[F_{i}=\frac{1}{1-\frac{a_{i-1}}{b_{i-1}}x} \]

\[F_i=\frac{b_i-1}{b_{i-1}-a_{i-1}x} \]

那么就是:

\[a_i=b_{i-1} \]

\[b_i=b_{i-1}-a_{i-1}x \]

把转移写成矩阵:

\[ \begin{bmatrix} a_{i-1} & b_{i-1} \end{bmatrix} \begin{bmatrix} 0 & -x\\ 1 & 1 \end{bmatrix} = \begin{bmatrix} a_{i} & b_{i} \end{bmatrix} \]

直接矩阵快速幂优化即可。为了方便可以把 \(a_i,b_i\) 全部 DFT,最后求值的时候再 IDFT 回去。

初始 \(F_0=1\),即 \(a_0=b_0=1\)

最后答案为 \([x^n]F_m\)

复杂度 \(O(n \log n)\)

posted @ 2025-08-27 11:28  _Kenma  阅读(39)  评论(0)    收藏  举报