//hdu2512 一卡通大冒险 /* 第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。 递推公式为: S(n,k) = 0(n<k||k=0), S(n,n) = S(n,1) = 1, S(n,k) = S(n-1,k-1) + kS(n-1,k). 昨天晚上刚看了下算法分析与设计,觉得这个也可以用备忘录方法的DP做吧,就做了一下,这里做的有点烦。只要知道斯特灵公式,就可以了,又是数学,泪奔~ */ #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #include<vector> #include<string> #include<sstream> #include<set> #include<map> #include<queue> #include<stack> using namespace std; const int N=2001; int F[N][N]; int S(int n,int k) { if(k>n || k==0) return 0; if(n==k || k==1) return 1; if(F[n][k]!=-1) return F[n][k]; return S(n-1,k-1)+k*S(n-1,k); } void init() { fill(&F[1][1],&F[N-1][N-1]+1,-1); for(int i=1;i<N;i++) { for(int j=1;j<N;j++) { F[i][j]=S(i,j); F[i][j]%=1000; } } } int main() { int T; scanf("%d",&T); init(); while(T--) { int i,x,sum=0; scanf("%d",&x); for(i=1;i<=x;i++) { sum+=F[x][i]; sum=sum%1000; } printf("%d/n",sum); } return 0; }