【HDU 2512】第二类斯特林数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/giftedpanda/article/details/101272335

第二类斯特林数:n 个不同的小球放进 r 个 相同的盒子

S[n][r] = S[n-1][r-1] + r * S[n-1][r]

S[n][r]:n 个不同的小球放进 r 个相同的盒子

S[n-1][r-1]:最后一个小球单独放进一个盒子里面

r * S[n-1][r]:前面 n - 1个球放进了 r 个盒子里面,最后一个球放进 r 个盒子里面的任意一个球

// 第二类斯特林数  n个不同的球放进r个相同的盒子
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2000 + 7;
typedef long long ll;
const ll mod = 1000;  // 取模
ll S[maxn][maxn]; // 第二类斯特林数
void init()
{
	S[0][0] = 0, S[1][1] = 1;
	for(ll i = 2; i < maxn; i++) {
		for(ll  j = 1; j <= i; j++) S[i][j] = (S[i-1][j-1] % mod + j % mod * S[i-1][j] % mod) % mod;
	}
}
int main()
{
	init();
	int t, n;
	scanf("%d", &t);
	while(t--) {
		scanf("%d", &n);
		ll ans = 0;
		for(int i = 1; i <= n; i++) ans = (ans + S[n][i]) % mod;
		printf("%lld\n", ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/giftedpanda/article/details/101272335
今日推荐