今天看到两位巨巨,都不敢直视了、、、自己已经那么弱了,却没有一点的动力、、、
第一类Stirling数是有正负的,其绝对值是个元素的项目分作个环排列的方法数目。常用的表示方法有。
换个较生活化的说法,就是有个人分成组,每组内再按特定顺序围圈的分组方法的数目。例如:
- {A,B},{C,D}
- {A,C},{B,D}
- {A,D},{B,C}
- {A},{B,C,D}
- {A},{B,D,C}
- {B},{A,C,D}
- {B},{A,D,C}
- {C},{A,B,D}
- {C},{A,D,B}
- {D},{A,B,C}
- {D},{A,C,B}
- 给定,有递归关系
递推关系的说明:考虑第n+1个物品,n+1可以单独构成一个非空循环排列,这样前n种物品构成k-1个非空循环排列,方法数为s(n,k-1);也可以前n种物品构成k个非空循环排列,而第n+1个物品插入第i个物品的左边,这有n*s(n,k)种方法。
第二类Stirling数是个元素的集定义k个等价类的方法数目。常用的表示方法有。
换个较生活化的说法,就是有个人分成组的分组方法的数目。例如有甲、乙、丙、丁四人,若所有人分成1组,只有所有人在同一组这个方法,因此;若所有人分成4组,只可以人人独立一组,因此;若分成2组,可以是甲乙一组、丙丁一组,或甲丙一组、乙丁一组,或甲丁一组、乙丙一组,或其中三人同一组另一人独立一组,即是:
- {A,B},{C,D}
- {A,C},{B,D}
- {A,D},{B,C}
- {A},{B,C,D}
- {B},{A,C,D}
- {C},{A,B,D}
- {D},{A,B,C}
因此。
- 给定,有递归关系
- 递推关系的说明:考虑第n个物品,n可以单独构成一个非空集合,此时前n-1个物品构成k-1个非空的不可辨别的集合, 方法数为S(n-1,k-1);也可以前n-1种物品构成k个非空的不可辨别的 集合,第n个物品放入任意一个中,这样有k*S(n-1,k)种方法。
以上摘自wiki百科,算是mark一下,纯数学,弄懂递推关系是重点,再做一两道题,应该差不多了吧、、、、
例题:
该题就是简单的第二类stirling 数,即求 N 个东西放入 J 个盒子中,有多少种不同的方法(0 < J <= N)
注:由于该OJ 故障,该代码不知是否AC,仅供参考、、
#include <stdio.h>
#define mod 10000
int s[1100][1100]; // s[i][j],表示把i 个东西放入j个盒子中的方法数
int ans[1100]; // ans[i] ,表示 i 个球一共的放法数
int main()
{
s[1][1] = ans[1] = 1; // 初始化
for(int i = 2; i <= 1000; i ++)
{
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] %= mod;
ans[i] += s[i][j];
}
ans[i] %= mod;
}
int n;
while(~scanf("%d", &n))
{
printf("%d\n", ans[n]);
}
return 0;
}