[HDOJ] problem_2512:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int a[2001][2001];
int main()
{
int i,j,n,t,m,sum;
memset(a,0,sizeof(a));
a[1][1]=1;
for (i=2;i<=2000;i++)
{
for (j=1;j<=i;j++)
{
a[i][j]=(a[i-1][j]*j+a[i-1][j-1])%1000;
}
}
while (scanf("%d",&t)!=-1)
{
while (t--)
{
scanf("%d",&n);
sum=0;
for (i=1;i<=n;i++)
{
sum=(sum+a[n][i])%1000;
}
printf("%d\n",sum);
}
}
return 0;
}
先记录n张一卡通放入m(0<m<=n)本书的方法数,如下表,对1000取余;再将各行相加,对1000取余,即为 把n张一卡通夹到书里的方法数。
//
第二类StirlingS(n,k)有下列性质:
(a)S(n,0)=0,
(b)S(n,1)=1,
(c)S(n,2)=2n-1-1,
(d)S(n,n-1)=C(n,2),
(e) S(n,n)=1
满足下面的递推关系:
S(n,m)=m*S(n-1,m)+S(n-1,m-1),(n≥1,m≥1)