第二类Stirling数

来源:互联网 发布:网络电视盒子怎么用 编辑:程序博客网 时间:2024/03/29 02:48

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
原创粉丝点击