hdu 2521 一卡通大冒险 (斯特灵数,贝尔数)

来源:互联网 发布:java看什么书 编辑:程序博客网 时间:2024/04/24 08:28
/*将N张卡分成若干个集合,集合不为空,有多少种分法。f[n][m]表示n张卡分成m组的种类数,那么f[n][m]=f[n-1][m-1]+f[n-1][m]*m,//第二类斯特灵数而ans[n]=sum{f[n][l]}(1<=l<=m)。//ans为贝尔数,Bell数是将P个元素集合分到非空且不可区分例子的划分个数。其中:f[n-1][m-1]代表第n个人自成一堆;f[n-1][m]*m代表第n个人不自成一堆。*/# include <stdio.h># include <algorithm># include <string.h>using namespace std;int f[2011][2011];int main(){    int i,l;    int t,n;    int ans[2011];    f[1][1]=1;    ans[1]=1;    for(i=2;i<=2000;i++)    {        f[i][1]=1;//i张卡在一本书里        f[i][i]=1;//i张卡在i本书里        ans[i]=2;//上面;两种情况        for(l=2;l<i;l++)        {            f[i][l]=f[i-1][l-1]+f[i-1][l]*l;            f[i][l]%=1000;            ans[i]=(ans[i]+f[i][l])%1000;        }    }    while(~scanf("%d",&t))    {        while(t--)        {            scanf("%d",&n);            printf("%d\n",ans[n]);        }    }    return 0;}

0 0