斯特林数(Stirling number)

 

在组合数学,Stirling 数可指两类数,第一类Stirling 数和第二类 Stirling 数,都是由18世纪数学家 James Stirling 提出的。
Stirling 数有两种,第一类和第二类Stirling 数

第一类斯特林数:

形如[nm]也写作 s(n,k)

组合意义:

s(n,k) 表示吧n个数分成k,每组是一个,求分成的方案数。

也就是一个轮子,怎么转都是一样的,如:1,2,3,4 和 4,1,2,3 只算一种方案。

递推式:

s(n+1,2)=s(n,1)+s(n,2)n

即要么自成一个环,要么加入其它k个环,可以插入n1个位置。(每两个数之间)

当然边界条件[00]=1

性质:

 1. s(n,1)=(n1)!

 2. s(n,2)=(n1)!×i=1n11i

 3. i=0ns(n,k)=n!

证明:

 1. 显然,我们把n个元素排列起来,有n!种可能,首尾相接即可得到一个环。这里面每种情况重复了n次,因为可以旋转n次,所以除以n,得到s(n,1)=(n1)!

 2. 通过数学归纳法可以证明。

s(n+1,2)=s(n,1)+s(n,2)n=(n1)!+n(n1)!i=1n11i=(n1)!+n!i=1n11i=n!n+n!i=1n11i=n!i=1n1i

 3. 这里有一个巧妙地“算两次”方法。
 首先构造一个问题,求n个数的所有排列。
 首先用乘法原理直接得出结论,ans=n!
 我们知道,对于一个排列对应一个置换,即:

(12...na1a2...an)

 把这个置换中的上下对应位置连边,可以得到许多的环。由于排列和置换是一一对应的,所以我们要求排列的个数,就是求用n个元素组成环的方案数,所以我们枚举环的个数:

n!=k=1ns(n,k)

 由于我们有s(n,0)=0,所以也可以写成:

k=0ns(n,k)=n!

第二类斯特林数:

形如{nk}也写作 S(n,k)

组合意义:

S(n,k) 表示吧n个数分成k组,组内无序,每组没有区别

递推式:

{nk}={n1k1}+{n1k}k

即要么自成一个组,要么加入其它k个组,可以插入k个组。

当然边界条件{00}=1

性质:

 没有什么特别常用的。

通项公式:

S(n,m)=1m!k=0m(1)kCmk(mk)n

大概就是容斥原理,k枚举有多少个集合是空的,每种情况有Cmk种空集情况,n个元素可以放进非空的mk个集合中。这样求出来的答案是有序的,所以我们除以m!使得其变为无序。

卷积形式:

它具有卷积的形式{nm}=k=0m(1)kk!(mk)n(mk)!

可以用FFT在O(mlog2m)的时间内算出{n1}{nm}

转化幂:

第二类斯特林数可以用于转化幂:xn=k=1n{nk}xk_,可以用归纳法证明 

xn=xk=1n1{n1k}xk_=k=1n1{n1k}(xk+1_+kxk_)=k=1n{n1k1}xk_+k=1n{n1k}kxk_=k=1n{nk}xk_

posted @   ezoiLZH  阅读(6975)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示