UOJ424 Count 生成函数、多项式求逆、矩阵快速幂

传送门


两个序列相同当且仅当它们的笛卡尔树相同,于是变成笛卡尔树计数。

然后注意到每一个点的权值一定会比其左儿子的权值大,所以笛卡尔树上还不能够存在一条从根到某个节点的路径满足向左走的次数\(> m-1\)。不难证明只需这个条件以及\(n \geq m\)的条件满足,一定存在一种权值分配方案使得\(1\)\(m\)都被分配到。

不妨设\(F_i(x)\)表示向左走的次数小于\(i\)的笛卡尔树数量的生成函数,即\(f_{i,j}\)表示\(j\)个点、向左走的次数小于\(i\)的笛卡尔树的数量。

那么有\(F_0(x) = 1 , F_i(x) = F_{i-1}x \times F_i(x) \times x + 1\),后者表示的是给根选择一个向左走次数小于\(i-1\)的笛卡尔树作为其左儿子,选择一个向左走次数小于\(i\)的笛卡尔树作为其右儿子。那么可以得到\(F_i(x) = \frac{1}{1 - xF_{i-1}(x)}\)

\(F_{i-1}(x) = \frac{A}{B}\),则\(F_i(x) = \frac{B}{B-xA}\)。转移可以用矩阵乘法表示,即\(\left(\begin{array}{cccc} A & B \end{array}\right) \times \left(\begin{array}{cccc} 0 & -x \\ 1 & 1 \end{array}\right) = \left(\begin{array}{cccc} B & B - xA \end{array}\right)\),考虑矩阵快速幂优化这个过程。

那么我们需要解决的问题是如何快速进行多项式乘法和加法,不难想到先对于所有多项式DFT求出其点值表示,这样在矩阵快速幂的过程中只需对多项式进行点乘和加法。最后IDFT得到系数表示后多项式求逆即可求出答案。

记得特判\(n时答案为\(0\)

代码

你可能感兴趣的:(UOJ424 Count 生成函数、多项式求逆、矩阵快速幂)