HDU 2512 一卡通大冒险(斯特灵数,贝尔数)

来源:互联网 发布:吴昕淘宝店 编辑:程序博客网 时间:2024/04/20 07:32

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove

题目:将N张卡分成若干个集合,集合不为空,有多少种分法。

http://acm.hdu.edu.cn/showproblem.php?pid=2512

显然集合个数为1,2……n。也就是将N张卡放到i个集合内。

这类组合问题用第二类斯特灵数可以解决

S(P,K)=S(P-1,K-1)+K*S(P-1,K);表示P个元素放入K个不可区分的集合中而且集合不为空的划分个数。

那么问题的解为sigma(S(P,i))  (P=>i>=1) 这个和称为bell数。

Bell数是将P个元素集合分到非空且不可区分例子的划分个数。详见组合数学

#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#define LL long long#define eps 1e-7#define MOD 1000using namespace std;int stir2[2005][2005]={1};int bell[2005];int main(){    for(int i=1;i<=2000;i++){        stir2[i][0]=0;        stir2[i][i]=1;        for(int j=1;j<i;j++)            stir2[i][j]=(stir2[i-1][j-1]+j*stir2[i-1][j])%MOD;    }    for(int i=1;i<=2000;i++){        bell[i]=0;        for(int j=0;j<=i;j++)            bell[i]=(bell[i]+stir2[i][j])%MOD;    }    int n,t;    cin>>t;    while(t--){        cin>>n;        cout<<bell[n]<<endl;    }    return 0;}


原创粉丝点击