【组合数学】第一类,第二类斯特林数(Stirling),Bell数

第一类斯特林数

定理:

第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数。

证明:把上述定理叙述中的循环排列叫做圆圈

递推公式:

S1(p,p)=1(p>=0),有p个人和P个圆圈,每个圆圈就只有一个人

S1(P,0)=0(P>=1)如果至少有1个人,那么任何安排都至少包含一个圆圈

S1(P,K)=(P-1)*S1(P-1,K)+S1(P-1,K-1)

设P个人的编号为1,2,3,4.....P,将P个人排成k个圆圈有两种情况:

1.在一个圆圈里只有编号为P的人,排法有S1(P-1,K-1)个。

2.P至少和另外一个人在一个圆圈里。这些排法可以通过把1,2.....p-1排成k个圆圈,再把p放在1,2........p-1任意一个人的左边,因此,第二种类型的排法有(p-1)*S1(p-1,k)种做法

在证明中,我们所作的就是把{1,2,3,4.......P}划分到K个非空且不可区分的盒子,然后每个盒子中的元素排成一个循环排列

long long s1[maxn][maxn];//存放第一类Stirling数
long long mod=1e9+7;//取模
void init()
{
    s1[1][1]=1;
    for(int i=2;i<maxn;i++)
        for(int j=1;j<maxn;j++)
        s1[i][j]=(s1[i-1][j-1]+(i-1)*s1[i-1][j])%mod;
}

第二类斯特林数

定理:

第二类Stirling数S2(P,K)计数表示把P元素划分到k个不可区分的盒子里且没有空盒子的划分个数

证明:

S2(P,P)=1(P>=0)           

S2(P,0)=0 (p>=1)                   

递推公式:S2(p,k)=k*S2(p-1,k)+S2(p-1,k-1)  (1<=k<=p-1)

把{1,2,3,4......p}分到k个非空且不可区分的盒子里的划分有两种情况:

1.P单独在一个集合,存在S2(p-1,k-1)种划分个数

2.p不单独在一个盒子的划分,p和其他元素在一个集合,也就是在没有放P之前,有p-1个元素已经分到了K个非空且不可区分的盒子里,现在把P放进去,有K种选择,存在K*S2(p-1,k)种划分

long long s2[maxn][maxn];//存放第二类Stirling数
long long mod=1e9+7;//取模
void init()
{
    s2[1][1]=1;
    for(int i=2;i<maxn;i++)
        for(int j=1;j<maxn;j++)
        s2[i][j]=(s2[i-1][j-1]+j*s2[i-1][j])%mod;
}

扩展:K!* S(P,K)计数就是把P元素集合划分到K个可区分的盒子里,且没有空盒子的划分个数

Bell数

定理:B(P)是将P元素集合分到非空,且不可区分盒子的划分个数(没有要求分到几个盒子里)

B(p)=S2(P,0)+S2(P,1)+S2(P,2)+S2(P,3)+S2(P,4)+........S2(P,n);

即先求出第二类斯特林数,然后求和即可

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/82866466