转载https://blog.csdn.net/sxh759151483/article/details/83420939
第一类斯特林数
解决问题:给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]
ll Bell[maxn]; void init() { ll x[maxn]; Bell[0] = 1LL; Bell[1] = 1LL; x[0] = 1LL; for(int i = 2; i < maxn; i++) { x[i - 1] = Bell[i - 1]; for(int j = i - 2; j >= 0; j--) x[j] = (x[j]%mod + x[j + 1]%mod)%mod; Bell[i] = x[0]%mod; } }
HDU:2512(贝尔数裸题)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e4+10; const ll mod=1000; int n; ll Bell[maxn]; void init() { ll x[maxn]; Bell[0] = 1LL; Bell[1] = 1LL; x[0] = 1LL; for(int i = 2; i < maxn; i++) { x[i - 1] = Bell[i - 1]; for(int j = i - 2; j >= 0; j--) x[j] = (x[j]%mod + x[j + 1]%mod)%mod; Bell[i] = x[0]%mod; } } int main(){ int T; init(); while(cin>>T){ while(T--){ cin>>n; cout<<Bell[n]<<endl; } } return 0; }