大数,利用滚动数组
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
const int N=3000;
int sum[6][N];
int len[6];
inline void add(int st)
{
int mx=len[(st-1+5)%5];
for(int i=0;i<mx;i++)
{
sum[st][i]=sum[(st+1)%5][i]+sum[(st+2)%5][i]+sum[(st+3)%5][i]+sum[(st+4)%5][i];
}
for(int i=0;i<mx;i++)
{
if(sum[st][i]>9)
{
sum[st][i+1]+=sum[st][i]/10;;
sum[st][i]%=10;
}
}
if(sum[st][mx]>0) len[st]=mx+1;
else len[st]=mx;
// printf("%d",sum[st][0]);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(sum,0,sizeof(sum));
sum[0][0]=1;
sum[1][0]=1;
sum[2][0]=1;
sum[3][0]=1;
for(int i=0;i<4;i++)
len[i]=1;
int mx=1;
if(n<=4)
{
printf("1\n");
continue;
}
int st=4;
for(int i=st;i<=n-1;i++)
{
add(st);
st=(st+1)%5;
}
st=(st+4)%5;
for(int i=len[st]-1;i>=0;i--)
{
printf("%d",sum[st][i]);
}
printf("\n");
}
return 0;
}