先上一段百度的定义
第二类Stirling数
定义
第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为
或者
。和第一类Stirling数不同的是,集合内是不考虑次序的,而圆排列是有序的。常常用于解决组合数学中几类放球模型。描述为:将n个不同的球放入m个无差别的盒子中,要求盒子非空,有几种方案?
第二类Stirling数要求盒子是无区别的,所以可以得到其方案数公式:
递推式
第二类Stirling数的推导和第一类Stirling数类似,可以从定义出发考虑第n+1个元素的情况,假设要把n+1个元素分成m个集合则分析如下:
(1)如果n个元素构成了m-1个集合,那么第n+1个元素单独构成一个集合。方案数
(2)如果n个元素已经构成了m个集合,将第n+1个元素插入到任意一个集合。方案数 m*S(n,m) 。
综合两种情况得:
第二类斯特林数应用
洛谷盒子与球代码P1287 盒子与球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
using namespace std;
int dp[12][12] = { 1 }, r, n;
int main() {
cin >> n >> r;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= r; j++)
dp[i][j] = dp[i - 1][j - 1] + j * dp[i - 1][j];
for (int i = 1; i <= r; i++)dp[n][r] *= i;
cout << dp[n][r];
return 0;
}