zoukankan      html  css  js  c++  java
  • [模板] 斯特林数,性质以及求法

    斯特林数 (Stirling Number) 是两组数列, 其与上升幂,下降幂多项式密切相关, 也广泛用于组合问题中.

    第一类斯特林数

    定义

    定义(无符号)第一类斯特林数, 表示 (n) 个有标号元素分为 (k) ((k le n)) 个无标号环排列 (翻转算两种) 的方案数.
    记做 ({n rack k}), 或者 (c(n,k)), (|s(n,k)|), (left|s_n^k ight|).

    枚举最后一个元素的位置, 容易得到递推式

    [egin{cases} {n rack k} = {n-1 rack k-1} + (n-1){n-1 rack k} & (n > 0, k < n)\ {n rack 0} = 0 & (n>0) \ {n rack n} = 1 & (n ge 0)\ end{cases}]

    有符号的斯特林数可以表示为

    [s(n,k) = (-1)^{n-k} {nrack k} ]

    它的定义是这样的:
    首先定义 (n) 次下降幂和上升幂

    [x^{underline n} = frac {x!}{(x-n)!} = prod_{i=x-n+1}^x i ]

    [x^{overline n} = frac {(x+n-1)!}{(x-1)!} = prod_{i=x}^{x+n-1} i = (-1)^n (-x)^{underline n} ]

    容易发现这是一个常数项为 (0)(n) 次多项式. 那么可以定义

    [x^{underline n} = sum_{i=0}^n s(n,i) x^i ]

    [x^{overline n} = sum_{i=0}^n {n rack i} x^i ]

    求法... 待更

    性质... 待更

    第二类斯特林数

    定义

    定义第二类斯特林数, 表示 (n) 个有标号元素分为 (k) ((k le n)) 个无标号非空集合的方案数.
    记做 ({n race k}), 或者 (S(n,k)).

    同样的, 可以得到递推式:

    [egin{cases} {n race k} = {n-1 race k-1} + k{n-1 race k} & (n > 0, k < n)\ {n race 0} = 0 & (n>0) \ {n race n} = 1 & (n ge 0)\ end{cases} ]

    第二类斯特林数也有关于下降幂/上升幂的定义:

    [x^{n}=sum_{k=0}^{n}{n race k}x^{underline k} ]

    [x^{n}=sum_{k=0}^{n}(-1)^{n-k}{n race k}x^{overline k} ]

    求法

    我们显然有一个 (O(n^2)) 的递推求法.

    但有时我们想求出单点的值, 或者求出 (S(n,k), k in {0,1,dotsc, n}) 的所有值, 那么就需要更快的算法.

    (S'(n,k)) 表示 (n) 个有标号元素分为 (k)有标号非空集合的方案数, 显然有

    [S'(n,k) = S(n,k) * k! ]

    (g(n,k)) 表示 (n) 个有标号元素分为 (k)有标号可空集合的方案数, 还有

    [g(n,k) = k^n ]

    枚举非空集合的个数, 可以发现

    [g(n,k) = sum_{i=0}^k {k choose i}S'(n,i) ag{1} ]

    二项式反演:

    [S'(n,k) = sum_{i=0}^k (-1)^{k-i} {k choose i}g(n,i) ag{2} ]

    那么就可以求出 (S(n,k)):

    [S(n,k) = frac{S'(n,k)}{k!} ]

    [S(n,k) = sum_{i=0}^k (-1)^{k-i}frac{1}{(k-i)!} frac{i^n}{i!} ag{3} ]

    这样, 我们就可以在 (O(n)) 的时间复杂度内求出 (S(n,k));
    容易发现这是一个卷积, 直接FFT即可求出 (S(n,k), k in {0,1,dotsc, n}), 时间复杂度 (O(n log n)).

    Note a:

    求出来的 (S(n,k)) 的表达式在 (n < k) 时也是正确的! 这时它的值为 (0).
    (n < k) 时, ((1)) 式可以看作

    [g(n,k) = sum_{i=0}^k {k choose i}S'(n,i) = sum_{i=0}^n {k choose i}S'(n,i) ]

    也就是说, (S'(n,i) (n<i)) 的值自然为0. 那么反演出来的式子自然也可以保证 (S'(n,i) = 0(n<i)), 即 (S(n,i) = 0(n<i)).

    Note b:

    定义 (0^0 = 1).

    性质

    ...待更

  • 相关阅读:
    Linux上的.NET框架Mono 2.0发布
    WordPress数据库管理中五个实用的phpMyAdmin技巧
    美国十三个性价比较好的空间推荐 建站可优选
    众多站长将网站移民海外 该如何选择国外VPS
    Mono 开发 (使用.NET技术的你,绝对不能忽略Mono)
    数据库访问的性能问题与瓶颈问题【z】
    IE和FireFox中的event事件
    经典国外网站大放送
    AppScan 7.8.1 简体中文
    用lighttpd+mono在Linux上面跑ASP.NET程序
  • 原文地址:https://www.cnblogs.com/ubospica/p/10912502.html
Copyright © 2011-2022 走看看