{n,k}表示将n个两两不同的元素划分成k个非空子集的方案数
注意:不需要排序,因为集合无序
假设已知{n-1,k-1}和{n-1,k}
同样的,有两种情况
1:n单独作为集合,结果为{n-1,k-1}
2:n放入之前的集合,结果为(k){n-1,k}
性质:
{n,0}=0
{n,1}=1
{n,n}=1
{n,2}=2^(n-1)-1
{n,n-1}=C(n,2)
{n,n-2}=C(n,3)+3C(n,4)
第二类斯特林数有通项公式:
{n,m}=(1/m!)*(k从0累加到m)(-1)^k * C(m,k)*(m-k)^n
第一二类斯特林数的置换性
(k从0累加到n)[n,k]{k,m}=(k从0累加到n){n,k}[k,m]
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1010, MOD = 1e9 + 7;
int n, m;
int f[N][N];
int main() {
cin >> n >> m;
f[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
f[i][j] = (f[i - 1][j - 1] + (LL)j* f[i - 1][j]) % MOD;
}
}
cout << f[n][m] << endl;
return 0;
}