1 #include <bits/stdc++.h>
2 #define pb push_back
3 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
4 #define INF 0x3f3f3f3f
5
6 using namespace std;
7 const int maxn = 2000;
8 class HP
9 {
10 public : int len,s[maxn]; HP() {(*this) = 0;};
11 HP(int inte) {(*this)=inte;}; HP(const char*str) {(*this)=str;};
12 friend ostream& operator << (ostream &cout,const HP &x);
13 HP operator = (int inte); HP operator = (const char*str);
14 HP operator * (const HP &b);HP operator + (const HP &b);
15 HP operator - (const HP &b);HP operator / (const HP &b);
16 HP operator % (const HP &b);int Compare(const HP &b);
17 bool operator < (const HP &b);
18 };
19
20 ostream& operator << (ostream &cout,const HP &x)
21 {for(int i = x.len;i >= 1;i --) cout<<x.s[i];return cout;}
22
23 HP HP::operator = (const char *str)
24 {
25 len = strlen(str);
26 for(int i = 1;i <= len;i ++) s[i] = str[len-i]-'0';
27 return (*this);
28 }
29
30 HP HP::operator = (int inte)
31 {
32 if(inte==0) {len = 1;s[1] = 0;return (*this);};
33 for(len = 0;inte > 0;) {s[++len] = inte%10;inte /= 10;};
34 return (*this);
35 }
36
37 HP HP::operator * (const HP&b)
38 {
39 int i,j;HP c;c.len = len+b.len;
40 for(i = 1;i <= c.len;i ++) c.s[i] = 0;
41 for(i = 1;i <=len;i ++) for(j = 1;j <=b.len;j ++) c.s[i+j-1]+=s[i]*b.s[j];
42 for(i = 1;i < c.len;i ++) {c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}
43 while(c.s[i]) {c.s[i+1]=c.s[i]/10;c.s[i]%=10;i ++;}
44 while(i>1&&!c.s[i]) i--;c.len = i;
45 return c;
46 }
47
48 HP HP::operator+(const HP &b)
49 {
50 int i;HP c;c.s[1] = 0;
51 for(i = 1;i <=len || i<=b.len || c.s[i];i ++)
52 {
53 if(i<=len) c.s[i]+=s[i];
54 if(i<=b.len) c.s[i]+=b.s[i];
55 c.s[i+1]=c.s[i]/10;c.s[i]%=10;
56 }
57 c.len = i-1;if(c.len==0) c.len = 1;
58 return c;
59 }
60
61 HP HP::operator-(const HP&b)
62 {
63 int i, j;HP c;
64 for(i = 1,j = 0;i <= len;i ++)
65 {
66 c.s[i] = s[i]-j;if(i<=b.len) c.s[i]-=b.s[i];
67 if(c.s[i]<0){j = 1;c.s[i]+=10;}else j = 0;
68 }
69 c.len = len;while(c.len>1&&!c.s[c.len]) c.len--;
70 return c;
71 }
72
73 int HP::Compare(const HP &y)
74 {
75 if(len>y.len) return 1;
76 if(len<y.len) return -1;
77 int i = len;
78 while((i>1)&&(s[i]==y.s[i])) i--;
79 return s[i]-y.s[i];
80 }
81
82 bool HP::operator < (const HP &y)
83 {
84 if(this->Compare(y)>=0) return false;
85 return true;
86 }
87
88 HP HP::operator / (const HP&b)
89 {
90 int i,j;HP d(0),c;
91 for(i = len;i > 0;i --)
92 {
93 if(!(d.len==1 && d.s[1]==0))
94 {for(j = d.len;j > 0;j --) d.s[j+1]=d.s[j];++d.len;}
95 d.s[1] = s[i]; c.s[i] = 0;
96 while((j = d.Compare(b))>=0)
97 {d=d-b;c.s[i]++;if(j==0) break;}
98 }
99 c.len = len;while((c.len>1)&&(c.s[c.len]==0)) c.len--;
100 return c;
101 }
102
103 HP HP::operator%(const HP&b)
104 {
105 int i,j;HP d(0);
106 for(i = len;i > 0;i --)
107 {
108 if(!(d.len==1 && d.s[1]==0))
109 {for(j = d.len;j > 0;j --) d.s[j+1]=d.s[j];++d.len;}
110 d.s[1] = s[i];
111 while((j = d.Compare(b))>=0) {d = d-b;if(j==0)break;}
112 }
113 return d;
114 }
115
116 HP d[maxn];
117 HP solve(int n)
118 {
119 HP a = 0;
120 if(a < d[n])
121 return d[n];
122
123 return d[n] = solve(n-1)+solve(n-2)+solve(n-4);
124 }
125
126 int main()
127 {
128 int N;
129 d[1] = 1;
130 d[2] = 2;
131 d[3] = 4;
132 d[4] = 7;
133 for(int i = 4;i <= 1000;i ++)
134 solve(i);
135 while(~scanf("%d",&N))
136 {
137 cout << solve(N) << endl;
138 }
139 return 0;
140 }