/* 将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; }
时间: 2024-12-19 23:26:32