第一类斯特林数:
s (n,m)表示把n 个元素划分为m 个非空循环排列集合的方案数。
递推式:s(n,m)=s(n−1,m−1)+(n−1)∗s(n−1,m)
const ll maxn=20;
ll stirling[maxn][maxn];
void Stirling()
{
stirling[0][0]=0,stirling[1][1]=1;
for(ll i=2;i<maxn;i++)
for(ll j=1;j<=i;j++)
stirling[i][j]=stirling[i-1][j-1]+(i-1)*stirling[i-1][j];
}
第二类斯特林数:
s(n,m)表示把n 个元素划分为m 个非空集合的方案数。
递推式:s(n,m)=s(n−1,m−1)+m∗s(n−1,m)
const ll maxn=20;
ll stirling[maxn][maxn];
void Stirling()
{
stirling[0][0]=0,stirling[1][1]=1;
for(ll i=2;i<maxn;i++)
for(ll j=1;j<=i;j++)
stirling[i][j]=stirling[i-1][j-1]+j*stirling[i-1][j];
}
贝尔数:
B(n)表示把n个元素划分成若干个非空集合的方案数。
第二类斯特林数求和
const ll maxn=20;
ll bell[maxn];
void Bell()
{
ll t[maxn];
bell[0]=bell[1]=1;t[0]=1;
for(int i=2;i<maxn;i++)
{
t[i-1]=bell[i-1];
for(int j=i-2;j>=0;j--) t[j]=t[j+1]+t[j];
bell[i]=t[0];
}
}