【组合数学】第一类,第二类斯特林数(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);
即先求出第二類斯特林數,然后求和即可
總結
以上是生活随笔為你收集整理的【组合数学】第一类,第二类斯特林数(Stirling),Bell数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java大数总结
- 下一篇: Wannafly summer camp