第二类Stirling数

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)表示

题目:Hearthstone II

<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>









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值