XidianOJ 1112 Too stupid

时间:2024-01-02 22:58:26

题目描述

某天 light由于太富而且太帅遭到了歹徒的袭击,现在他遇到了n个歹徒,准备对light施行不法行为,虽然light身体强壮,但是毕竟只有一个人肯定打不过那么多歹徒,但是高智商的light觉得歹徒们非常stupid,不打算束手就擒。经过观察他发现这些歹徒是有派系之分的
我们规定 A与B,B与C为同一个派系,那么A与C也为同一个派系
light认为,如果了解了歹徒的派系情况,他就可以用一些特殊的计谋战胜他们。但是,歹徒之间形成派系的可能性很多,而light对此一无所知。
现在问题来了,歹徒们有多少种可能形成派系的方案呢。由于方案数可能会很大,请对1000000007取模后输出。

输入

多组数据,处理到EOF

每组数据 第一行整数n       1 <= n <=1000

输出

输出方案数, 并对1000000007(1e9+7)取模

--正文

转换成球放盒的问题

n个球,放入n个盒子中,允许有空盒,求总方案数

第二类Stirling数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
#define MOD 1000000007
long long f[][];
long long sum[] = {};
int main(){
int i,j;
f[][] = ; f[][] = ;
for (i=;i<=;i++){
f[i][] = ; f[i][] = ;
for (j=;j<=i-;j++){
f[i][j] = (f[i-][j-] + j*f[i-][j]) % MOD;
}
f[i][i] = ;
}
for (i=;i<=;i++){
for (j=;j<=i;j++){
sum[i] = (sum[i] + f[i][j]) % MOD;
}
}
int n;
while (scanf("%d",&n) != EOF){
printf("%lld\n",sum[n]);
}
return ;
}