• 知识点简单总结——斯特林数、斯特林反演


    知识点简单总结——斯特林数、斯特林反演

    斯特林数

    第一类斯特林数: $ n $ 元置换分解为 $ k $ 个独立轮换的方案数,即:

    [egin{bmatrix} n \ k end{bmatrix} = ( n - 1 ) egin{bmatrix} n - 1 \ k end{bmatrix} + egin{bmatrix} n - 1 \ k - 1 end{bmatrix}. ]

    第二类斯特林数: $ n $ 个元素分成 $ k $ 个非空集合的方案数,即:

    [egin{Bmatrix} n \ k end{Bmatrix} = k egin{Bmatrix} n - 1 \ k end{Bmatrix} + egin{Bmatrix} n - 1 \ k - 1 end{Bmatrix}. ]

    下降幂与上升幂与斯特林反演

    下降幂:

    [x^{ underline{ n } } = x( x- 1 ) cdots ( x - n + 1 ). ]

    上升幂:

    [x^{ overline{ n } } = x( x + 1 ) cdots ( x + n - 1 ). ]

    以下给出的公式不予证明(咕了)。

    反转公式:

    [sumlimits_{ i } egin{bmatrix} n \ i end{bmatrix} egin{Bmatrix} i \ m end{Bmatrix} ( -1 )^{ n - i } = [ n == m ] \ sumlimits_{ i } egin{Bmatrix} n \ i end{Bmatrix} egin{bmatrix} i \ m end{bmatrix} ( -1 )^{ n - i } = [ n == m ] ]

    借助反转公式容易证明以下三个等式:

    [egin{aligned} x^{ underline{ n } } = sum_{ k = 0 }^{ n } (-1)^{ n - k } egin{bmatrix} n \ k end{bmatrix} x^{ k } & Longleftrightarrow x^{ n } = sum_{ k = 0 }^{ n } egin{Bmatrix} n \ k end{Bmatrix} x^{ underline{ k } } \ x^{ overline{ n } } = sum_{ k = 0 }^{ n } egin{bmatrix} n \ k end{bmatrix} x^{ k } & Longleftrightarrow x^{ n } = sum_{ k = 0 }^{ n } (-1)^{ n - k } egin{Bmatrix} n \ k end{Bmatrix} x^{ overline{ k } } \ x^{ overline{ n } } = sum_{ k = 0 }^{ n } L( n , k ) x^{ underline{ k } } & Longleftrightarrow x^{ underline{ n } } = sum_{ k = 0 }^{ n } ( -1 )^{ n - k } L( n , k ) x^{ overline{ k } } end{aligned} ]

    其中 $ L( n , m ) = sumlimits_{ i } egin{bmatrix} n ewline i end{bmatrix} egin{Bmatrix} i ewline m end{Bmatrix} = inom{ n - 1 }{ m - 1 } frac{ n! }{ m! } $ 。

    而且以上三种关系均可以扩展到任意的 $ f( n ) , g( n ) $ 。

    快速求斯特林数的行/列

    第一类斯特林数-行

    众所周知的有

    [x^{ overline{ n } } = sumlimits_{ k = 0 }^{n} egin{bmatrix} n \ k end{bmatrix} x^{ k } ]

    所以就是求 $ x^{ overline{ n } } $ 。

    考虑倍增,每次相当于是由 $ f( x ) $ 求 $ f( x + m ) $ 。

    设 $ a_{ i } = [ x^{ i } ] f( x ) $ ,有

    [egin{aligned} f( x + m ) &= sumlimits_{ i = 0 }^{ n } a_{ i } ( x + m )^{ i } \ &= sumlimits_{ i = 0 }^{ n } a_{ i } sumlimits_{ j = 0 }^{ i } x^{ j } m^{ i - j } inom{ i }{ j } \ &= sumlimits_{ j = 0 }^{ n } frac{ x^{ j } }{ j! } sumlimits_{ i = j }^{ n } i!a_{ i } frac{ m^{ i - j } }{ (i-j)! } end{aligned} ]

    把后面的 $ i!a_{ i } $ 反过来再卷积就好。

    第一类斯特林数-列

    生成函数。

    强制环有标号,单个的EGF $ F( x ) = sumlimits_{ i = 1 } ( i - 1 )! frac{ x^{ i } }{ i! } $ 。

    m个是 $ G( x ) = F^{ m }( x ) $ 。

    快速幂之后除回去 $ m! $ 就好。

    但注意由于 $ F( 0 ) $ 不能为 $ 0 $ ,所以要先平移计算完后在算回去。

    第二类斯特林数-行

    众所周知的有

    [egin{aligned} m^{ n } &= sumlimits_{ k = 0 }^{ n } egin{Bmatrix} n \ k end{Bmatrix} m^{ underline{ k } } \ &= sumlimits_{ k = 0 }^{ n } egin{Bmatrix} n \ k end{Bmatrix} inom{ m }{ k } k! \ &= sumlimits_{ k = 0 }^{ m } egin{Bmatrix} n \ k end{Bmatrix} inom{ m }{ k } k! \ end{aligned} ]

    [f( m ) =m^{ n } , g(m) = egin{Bmatrix} n \ m end{Bmatrix} m! ]

    二项式反演变成

    [egin{aligned} egin{Bmatrix} n \ m end{Bmatrix} m! &= sumlimits_{ k = 0 }^{ m } inom{ m }{ k } k^{ n } ( -1 )^{ m - k } \ egin{Bmatrix} n \ m end{Bmatrix} &= sumlimits_{ k = 0 }^{ m } frac{ k^{ n } }{ k! } frac{ ( -1 )^{ m - k } }{ ( m - k )! } end{aligned} ]

    直接上fft卷就好。

    第二类斯特林数-列

    直接从生成函数的角度考虑。

    先强制集合有标号,计算其EGF $ F( x ) = e^{ x } - 1 $ 。

    m个集合的答案就是 $ G( x ) = F^{ m }( x ) $ 。

    直接多项式快速幂。

    最后再除回去 $ m! $ 。

    关于 $ F( 0 ) $ 不能为 $ 0 $ 的处理方法同上。

  • 相关阅读:
    JavaScript 数组
    Function类型
    javascript面向对象(一)
    javascript变量的作用域
    登陆验证
    注册验证
    php类
    二叉搜索树的 查询最小值
    二叉 搜索树查找最大值
    二叉搜索树 中查找是否存在该值
  • 原文地址:https://www.cnblogs.com/rikurika/p/13387372.html
Copyright © 2020-2023  润新知