/*
按照大整数的模版来;
这个类型的斐波纳数列是前四项和,那么我们就讲其称为s1,s2,s3,s4,那么四项和即为s1+s2与s3+s4的和;
运用一个知识点,就是二维数组str[n][m] 的第i行的起始地址为str[i];
代码如下:
*/
#include<stdio.h>
#include<string.h>
int F[7061][550],c[550]; //7060时位数为2012
const int Base=10000;
//万进制 int 最大,如果只用 +,-,可加大Base=1000000000
int ONE[]={1,1}; //大整数 1
int ZERO[]={1,0}; //大整数 0
int comp(int *a, int *b);//大整数比较大小
void Prin(int *a);//printf 大整数a
void copy(int *a, int *b);// 赋值a=b
void add(int *a,int *b,int *c);//大整数+大整数 c=a+b
void Prin(int *a)
{
int i;//输出 "%04d" 10000进制
printf("%d", a[a[0]]);
for(i=a[0]-1;i>=1;i--)printf("%04d", a[i]);printf("\n");
}
void copy(int *a, int *b)
{
int i; //a=b
for(i = 0;i<= b[0]; ++i)
a[i] = b[i];
}
void add(int *A,int *B, int *sum)
{
int i,d[1000];
if((B[0]==1)&&(B[1]==0)){copy(sum,A);return;}
if((A[0]==1)&&(A[1]==0)){copy(sum,B);return;}
if (A[0] >= B[0]) { copy(sum,A);copy(d,B);}
else { copy(sum,B);copy(d,A);}
//转换为sum + d(即A、B的最大值和最小值);最终结果为sum
sum[sum[0] + 1] = 0; //存放可能出现的进位
for (i = 1; i <= d[0]; i++) //处理位数相同的
{
sum[i]+=d[i];
if (sum[i]>=Base)
{
sum[i]-=Base;
sum[i+1]++;
}
}
for (; i <= sum[0]; i++) //处理A、B中大的多出来的位数
{
if(sum[i]>=Base)
{
sum[i] -= Base;
sum[i+1]++;
}
else break;
}
if (sum[sum[0]+1]>0)sum[0] = sum[0] + 1;
}
int main()
{
int i,j,k,m,n;
for(i=1;i<=4;i++)copy(F[i],ONE);
for(i=5,j=3,k=1;i<=7050;i++,j++,k++)
{
add(F[k],F[k+1],F[0]);
add(F[j],F[j+1],c);
add(c,F[0],F[i]);
}
while(scanf("%d",&n)!=EOF)
{
Prin(F[n]);
}
}