Hdu 1297 Children’s Queue
http://acm.hdu.edu.cn/showproblem.php?pid=1297
在合法序列后面加上一个M,或两个FF,序列仍然合法。
在不合法序列后面加上FF,成为合法, 其实加一个F也能构成合法,但是这种情况包含在第一种里面;
所以递推方程式d[n] =d[n-1] + d[n-2] + d[n-4];
d[i] 中保存的都是合法序列数。
1 //Accepted 1297 15MS 628K 836 B C++ SuperBin
2 //d[i] = d[i-1] + d[i-2] + d[i-4];
3 #include <stdio.h>
4 #include <string.h>
5 #define max(x,y) ((x)>(y)?(x):(y))
6 #define EP 100000000
7 #define NL 1001
8 #define NLL 100
9
10 //打表保存1000以内的结果
11 //d[i][0]保存大整数的位数,d[i][1] 保存最低位
12 //每八位存储一个单元
13 int d[NL][NLL];
14
15 //计算d[k1] + d[k2], 结果保存在d[k0]中
16 void add(int k1, int k2, int k0)
17 {
18 int L;
19 int i;
20 int x, y;
21 L = max(d[k1][0], d[k2][0]);
22 y = 0;
23 for (i=1; i<=L; i++) {
24 x = d[k1][i] + d[k2][i] + y;
25 d[k0][i] = x % EP;
26 y = x / EP;
27 }
28 if (y > 0) {
29 d[k0][++L] = y;
30 }
31 d[k0][0] = L;
32 }
33
34
35 int main()
36 {
37 int i, len;
38 int n;
39 memset(d, 0, sizeof(d));
40 d[1][0] = d[2][0] = d[3][0] = d[4][0] = 1;
41 d[1][1] = 1;
42 d[2][1] = 2;
43 d[3][1] = 4;
44 d[4][1] = 7;
45 for (i=5; i<NL; i++) {
46 add(i-1, i-2, 0);
47 add(0, i-4, i);
48 }
49 while (scanf("%d", &n) != EOF) {
50 len = d[n][0];
51 printf("%d", d[n][len]);
52 for (i=len-1; i>=1; i--)
53 printf("%08d", d[n][i]);
54 printf("\n");
55 }
56 return 0;
57 }