#include <iostream> #include <algorithm> #include <time.h> using namespace std; #define maxsize 1005 struct hp { int len; int s[maxsize+1]; }; void copy(hp &a,hp &b) { a.len=b.len; for(int i=1;i<=b.len;i++) a.s[i]=b.s[i]; } void input(hp &a,string str) { int i; while(str[0]=='0' && str.size()!=1) str.erase(0,1); a.len=(int)str.size(); for(i=1;i<=a.len;++i) a.s[i]=str[a.len-i]-48; for (i=a.len+1;i<=maxsize;++i) a.s[i]=0; } void print(const hp &y) { int i; for(i=y.len;i>=1;i--) printf("%d",y.s[i]); cout<<endl; } void plusk(const hp &a,const hp &b,hp &c) //高精度加法 { int i,len; for(i=1;i<=maxsize;i++) c.s[i]=0; if(a.len>b.len) len=a.len; else len=b.len; for(i=1;i<=len;i++) { c.s[i]+=a.s[i]+b.s[i]; if(c.s[i]>=10) { c.s[i]-=10; c.s[i+1]++; } } if(c.s[len+1]>0) len++; c.len=len; } void subtract(const hp &a,const hp &b,hp &c) //高精度减法 { int i,len; for(i=1;i<=maxsize;i++) c.s[i]=0; if(a.len>b.len) len=a.len; else len=b.len; for(i=1;i<=len;i++) { c.s[i]+=a.s[i]-b.s[i]; if(c.s[i]<0) { c.s[i]+=10; c.s[i+1]--; } } while(len>1&&c.s[len]==0) len--; c.len=len; } int compare(const hp &a,const hp &b) { int len; if(a.len>b.len) len=a.len; else len=b.len; while(len>0 && a.s[len]==b.s[len]) len--; if(len==0) return 0; else return a.s[len]-b.s[len]; } void multiply(const hp &a,int b,hp &c) //高精度*单精度 { int i,len; for(i=1;i<=maxsize;i++) c.s[i]=0; len=a.len; for(i=1;i<=len;i++) { c.s[i]+=a.s[i]*b; c.s[i+1]+=c.s[i]/10; c.s[i]%=10; } len++; while(c.s[len]>=10) { c.s[len+1]+=c.s[len]/10; c.s[len]%=10; len++; } while(len>1&&c.s[len]==0) len--; c.len=len; } void multiplyh(const hp &a,const hp &b,hp &c) //高精度*高精度 { int i,j,len; for(i=1;i<=maxsize;i++) c.s[i]=0; for(i=1;i<=a.len;i++) for(j=1;j<=b.len;j++) { c.s[i+j-1]+=a.s[i]*b.s[j]; c.s[i+j]+=c.s[i+j-1]/10; c.s[i+j-1]%=10; } len=a.len+b.len+1; while(len>1&&c.s[len]==0) len--; c.len=len; } void divide(const hp &a,int b,hp &c,int &d) //高精度/单精度 {d为余数} { int i,len; for(i=1;i<=maxsize;i++) c.s[i]=0; len=a.len; d=0; for(i=len;i>=1;i--) { d=d*10+a.s[i]; c.s[i]=d/b; d%=b; } while(len>1&&c.s[len]==0) len--; c.len=len; } void multiply10(hp &a) //高精度*10 { int i; for(i=a.len;i>=1;i--) a.s[i+1]=a.s[i]; a.s[1]=0; a.len++; while(a.len>1&&a.s[a.len]==0) a.len--; } void divideh(const hp &a,const hp &b,hp &c,hp &d) //高精度/高精度 {d为余数} { hp e; int i,len; for(i=1;i<=maxsize;i++) { c.s[i]=0; d.s[i]=0; } len=a.len; d.len=1; for(i=len;i>=1;i--) { multiply10(d); d.s[1]=a.s[i]; while(compare(d,b)>=0) { subtract(d,b,e); d=e; c.s[i]++; } } while(len>1&&c.s[len]==0) len--; c.len=len; } hp sum[1003]; int main() { int n; // {n=1002; hp a, b,c,tmp; c.len=0; a.s[1]=1; for(int i=2;i<1002;i++) {b.s[i]=0; a.s[i]=0;} for(int i=0;i<1002;i++) { sum[i].len=1; memset( sum[i].s,0,sizeof(sum[i].s)); } a.len=1; b.s[1]=2 ; sum[1].s[1]=2; sum[2].s[1]=1; b.len=1; int pos=2; if(n>2) { for(int i=1;i<n;i++) { plusk(a,b,c); // copy(tmp,sum[pos]); copy(sum[pos],c); int pos2; pos2=pos+1; // plusk(sum[pos],a,sum[pos2]); copy(a,b); copy(b,c); pos++; } } // print(sum[pos]); } while(cin>>n) { print(sum[n]); } }