第一类Stirling数(斯特林数)
S(p, k)的递推公式:S(n, k)= (n - 1) * S(n- 1, k) + S(n - 1, k - 1).
边界条件:S(n, 0) = 0, n >= 1.
S(n, n) = 1, n>= 0.(有n个人和n个圆圈,每个圆圈就只有一个人)
我们考虑第n个物品。
1.该物品自己可以成一个非空循环排列,也就是S(k-1,n-1)种。
2.该物品也可以加到已经形成的k个非空循环排列中,共可以放在其他n- 1个物品的任意一个的一个位置。也就是( n - 1) * S(n- 1, k)种。
代码和杨辉三角求C(n,k)相似,要用long long,因为大于20种就会超int
第二类Stirling数(斯特林数)
S(n,k)是n个数的集合的划分为k个非空集合方法的数目。(n个不同小球放到m个相同的盒子,每个盒子至少放一个球的种数)
例如S3,2 = 3因为3个元素的集合{a, b, c}有3种不同的划分方法:
{{a}, {b, c}}, {{b}, {a, c}}, {{c}, {a, b}}。可以知道Bell(n) = Sn,ki,( 1 <= ki <= n)。
递推式:S(n, k) = k * S(n - 1, k) + S(n - 1, k - 1)
边界条件: S(n, n) = 1, n >= 0
S(n, 0) = 0, n >= 1
解释:第n个物品来单独考虑。。我们要分为k个集合。。
1.可以把当前第n个物品作为一个集合,也就是S(n - 1, k - 1)中方法。
2.也可以把当前第n个物品放在其他的集合中来构成k个集合。也就是S(n - 1, k)中方法。
扩展:k! *S(n,k) 计数的是把n元素集合划分到k个可区分的盒子里且没有空盒子的划分个数。
Bell数
B3 = 5因为3个元素的集合{a, b, c}有5种不同的划分方法:
{{a}, {b}, {c}}, {{a}, {b, c}}, {{b}, {a, c}}, {{c}, {a, b}}, {{a, b, c}}。
B0是1,因为空集正好有1种划分方法。
求和公式:
-
递推公式:
上述组合公式的证明:
依次类推,得到了上述组合公式