两个序列同构当且仅当两个序列生成的笛卡尔树相同。所以我们要对序列能够生成的笛卡尔树计数。
为了方便,我们钦定相等元素左边更大,这样笛卡尔树就成了二叉树。
不难发现,笛卡尔树合法的条件是,其任意左链的长度 \(\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)\)。