zoukankan      html  css  js  c++  java
  • 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 imes F_i(x) imes 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(egin{array}{cccc} A & B end{array} ight) imes left(egin{array}{cccc} 0 & -x \ 1 & 1 end{array} ight) = left(egin{array}{cccc} B & B - xA end{array} ight)),考虑矩阵快速幂优化这个过程。

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

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

    代码

  • 相关阅读:
    codeforces 938 C. Constructing Tests
    codeforces 981 C.Useful Decomposition
    Wannafly 挑战赛16 A 取石子
    codeforces 873 D. Merge Sort(分治)
    lightoj 1158
    lightoj 1226
    lightoj 1382
    lightoj 1283
    hdu 5445 Food Problem (多重背包)
    light 1205
  • 原文地址:https://www.cnblogs.com/Itst/p/11314428.html
Copyright © 2011-2022 走看看