HDU2512 一卡通大冒险 —— 第二类斯特林数

题目链接:https://vjudge.net/problem/HDU-2512

 

一卡通大冒险

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2572    Accepted Submission(s): 1741


Problem Description
因为长期钻研算法, 无暇顾及个人问题,BUAA ACM/ICPC 训练小组的帅哥们大部分都是单身。某天,他们在机房商量一个绝妙的计划"一卡通大冒险"。这个计划是由wf最先提出来的,计划的内容是,把自己的联系方式写在校园一卡通的背面,然后故意将自己的卡"遗失"在某处(如水房,TD,食堂,主M。。。。)他们希望能有MM看到他们遗失卡,能主动跟他们联系,这样就有机会请MM吃饭了。他们决定将自己的一卡通夹在基本相同的书里,然后再将书遗失到校园的各个角落。正当大家为这个绝妙的计划叫好时,大家想到一个问题。很明显,如果只有一张一卡通,那么只有一种方法,即,将其夹入一本书中。当有两张一卡通时,就有了两种选择,即,将两张一卡通夹在一本书里,或者分开夹在不同的书里。当有三张一卡通时,他们就有了5种选择,即:
{{A},{B},{C}} , {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} ,{{A,B,C}} 于是,
这个邪恶计划的组织者wf希望了解,如果ACM训练对里有n位帅哥(即有N张一卡通),那么要把这些一卡通夹到书里有多少种不同的方法。
 

 

Input
包含多组数据,第一行为n,表示接下来有n组数据。以下每行一个数x,表示共有x张一卡通。(1≤x≤2000).
 

 

Output
对每组数据,输出一行:不同的方法数,因为这个数可能非常大,我们只需要它除以1000的余数。
 

 

Sample Input
4 1 2 3 100
 

 

Sample Output
1 2 5 751
 

 

Author
BUAA Campus 2007
 

 

Source

 

 

题解:

单纯的第二类斯特林数。由于没有要求组数,因此对 S[n][k] 求和, 其中1<=k<=n 。

 

代码一:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cmath>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <string>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 const int INF = 2e9;
15 const LL LNF = 9e18;
16 const int MOD = 1e3;
17 const int MAXN = 2e3+10;
18 
19 LL S[MAXN][MAXN], f[MAXN];
20 
21 void init()
22 {
23  //   memset(S, 0, sizeof(S));
24     for(int i = 1; i<MAXN; i++)
25     {
26         S[i][0] = 0; S[i][i] = 1;
27         for(int j = 1; j<i; j++)
28             S[i][j] = ((j*S[i-1][j])%MOD + S[i-1][j-1])%MOD;
29     }
30 
31     memset(f, 0, sizeof(f));
32     for(int i = 1; i<MAXN; i++)
33         for(int j = 1; j<=i; j++)
34             f[i] = (f[i] + S[i][j])%MOD;
35 }
36 
37 int main()
38 {
39     int T, n;
40     scanf("%d", &T);
41     init();
42     while(T--)
43     {
44         scanf("%d", &n);
45         printf("%d\n", f[n]);
46     }
47 }
View Code

 

代码二:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cmath>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <string>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 const int INF = 2e9;
15 const LL LNF = 9e18;
16 const int MOD = 1e3;
17 const int MAXN = 2e3+10;
18 
19 LL S[2][MAXN], f[MAXN];
20 
21 void init()
22 {
23     int cur = 0;
24     memset(f, 0, sizeof(f));
25     for(int i = 1; i<MAXN; i++)
26     {
27         S[cur][0] = 0; S[cur][i] = 1;
28         for(int j = 1; j<i; j++)
29             S[cur][j] = ((j*S[!cur][j])%MOD + S[!cur][j-1])%MOD;
30 
31         for(int j = 1; j<=i; j++)
32             f[i] = (f[i] + S[cur][j])%MOD;
33 
34         cur ^= 1;
35     }
36 }
37 
38 int main()
39 {
40     int T, n;
41     scanf("%d", &T);
42     init();
43     while(T--)
44     {
45         scanf("%d", &n);
46         printf("%d\n", f[n]);
47     }
48 }
View Code

 

posted on 2018-01-23 14:41  h_z_cong  阅读(271)  评论(0编辑  收藏  举报

导航