S(p,k)的一个组合学解释是:
将p个物体划分成k个非空的不可辨别的(可以理解为盒子没有编号)集合的方法数。
也可以解释为:
p个有区别的球放到k个相同的盒子中,要求无一空盒,其不同的方案数用S(p,k)表示
S(p,k)的递推公式是:S(p,k) = k*S(p-1,k) + S(p-1,k-1) ,1<= k <=p-1
边界条件:
S(1,1) = 1 ,p>=1
S(p,0) = 0 ,p>=1
递推关系的说明:
考虑第p个物品,p可以单独构成一个非空集合,此时前p-1个物品构成k-1个非空的不可辨别的集合,方法数为S(p-1,k-1);
也可以前p-1种物品构成k个非空的不可辨别的集合,第p个物品放入任意一个中,这样有k*S(p-1,k)种方法。
若是把p个有区别的球放到k个不相同的盒子中,要求无一空盒,其不同的方案数用k!*S(p,k)表示
<span style="font-size:18px;">#include <stdio.h>
#include <string.h>
#define max 105
#define mod 1000000007
long long s[max][max];
long long ans[max];
void init()
{
memset(s,0,sizeof(s));
s[1][1]=1;
for(int i=2;i<=max;i++)
for(int j=1;j<=max;j++)
{
s[i][j]=s[i-1][j-1]+j*s[i-1][j];
s[i][j]%=mod;
}
ans[1]=1;
for(int i=2;i<=max;i++)
{
ans[i]=ans[i-1]*i;
ans[i]%=mod;
}
}
int main()
{
init();
int m,n;
while(scanf("%d %d",&n,&m)!=EOF)
printf("%lld\n",(s[n][m]*ans[m])%mod);
return 0;
} </span>