-
[1379] 小球划分
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
将N个不同的小球分成若干组,问总共有多少总分法
- 输入
-
包含多组数据,每行一个数n,表示共有n个小球。(1≤x≤1000).
- 输出
-
对每组数据,输出一行:不同的方法数,因为这个数可能非常大,我们只需要它除以10000的余数。
- 样例输入
-
1 2 3
- 样例输出
-
1 2 5
- 提示
-
无
- 来源
-
Lucifer
第二类strling数
用来解决i个东西放入J个盒子中,有多少种不同的方法.
公式是
s[i][1] = 1;
s[i][i] = 1;
s[i][j] = s[i - 1][ j - 1] + J * s[i - 1][j];
这是我写的代码,
开始写错的原因就是没有注意得出的s[i][j]没有取余数
贴出代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
int s[1111][1111];
int ans[1111];
int main()
{
for (int i = 1; i < 1001; i++)
{
s[i][0] = 0;
}
s[1][1] = 1;
ans[1] = 1;
for (int i = 2; i <= 1001; i++)
{
int res = 0;
for (int j = 1; j <= i; j++)
{
if (i == j || j == 1)
{
s[i][j] = 1;
}
else
{
s[i][j] = s[i - 1][j - 1] + j * s[i - 1][j];
}
s[i][j] %= 10000;
res += s[i][j];
}
ans[i] = res % 10000;
}
int x;
while (scanf("%d", &x) != EOF)
{
printf("%d\n", ans[x]);
}
return 0;
}
这是标称的
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;
#define M 10000
#define MAXN 1005
int f[MAXN][MAXN];
int res[MAXN];
int main()
{
int i,l;
f[1][1]=1;
res[1]=1;
for(i=2;i<=1000;i++)
{
f[i][1]=1;
f[i][i]=1;
res[i]=2;
for(l=2;l<i;l++)
{
f[i][l]=f[i-1][l-1]+f[i-1][l]*l;
f[i][l]%=M;
res[i]+=f[i][l];
}
res[i]%=M;
}
for (int i = 1; i <= 200; i++)
{
cout << res[i] << endl;
}
int n;
while(cin>>n)
{
cout<<res[n]<<endl;
}
return 0;
}