第一类斯特林数、第二类斯特林数、贝尔数总结+模板

第一类斯特林数 
解决问题:给n个元素,求出k个环排列的方法数 
Stirling[n][k]
1
1      1
2      3       1
6      11      6       1
24     50      35      10     1
120    274     225     85     15     1
720    1764    1624    735    175    21    1
5040   13068   13132   6769   1960   322   28   1
40320  109584  118124  67284  22449  4536  546  36  1
362880 1026576 1172700 723680 269325 63273 9450 870 45 1

const int maxn = 21;
ll Stirling[maxn][maxn], fac[maxn] = {1};
void init() {
	for(ll i = 1; i < maxn; i++)
		fac[i] = fac[i - 1] * i;
	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];
		}
	}
}

 

第二类斯特林数 
将n个不同元素拆分成m个集合的方案数
Stirling[n][m]
1
1 1
1 3   1
1 7   6    1
1 15  25   10    1
1 31  90   65    15    1
1 63  301  350   140   21    1
1 127 966  1701  1050  266   28   1
1 255 3025 7770  6951  2646  462  36  1
1 511 9330 34105 42525 22827 5880 750 45 1

const int maxn = 21;
ll Stirling[maxn][maxn];
void init() {
	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];
		}
	}
}

 

贝尔数
n个数可以划分成多少个集合
每个贝尔数是第二类斯特林数的和 
Bell[n]

const int maxn = 21;
ll Bell[maxn];
void init() {
	ll T[maxn];
	Bell[0] = 1;
	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] + T[j + 1];
	    Bell[i] = T[0];
	}
}

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值