Pagini recente » Cod sursa (job #999556) | Cod sursa (job #2169862) | Cod sursa (job #1025267) | Cod sursa (job #430527) | Cod sursa (job #126109)
Cod sursa(job #126109)
#include <cstdio>
#include <string>
#define base 100000000
#define nbase 8
int dp1[3][1001], dp2[3][1001];
inline void add(int a[], int b[])
{
int i, t=0;
for(i=1; i<=a[0] || i<=b[0] || t; ++i, t/=base)
a[i]=(t+=a[i]+b[i])%base;
a[0]=i-1;
}
inline void afis(int a[])
{
printf("%d", a[a[0]]);
int t, p, j;
for(int i=a[0]-1; i ; --i)
{
t=a[i];p=0;
while(t) t/=10, ++p;
for(j=1;j<=nbase-p;++j)printf("0");
if(a[i]) printf("%d", a[i]);
}
printf("\n");
}
int main()
{
//freopen("vecini.in","r",stdin);
int n;
//scanf("%d", &n);
n=2000;
if(n==0){ printf("0\n");return 0;}
if(n==1){ printf("1\n"); return 0;}
dp1[0][0]=1;
dp1[0][1]=2;
dp1[1][0]=1;
dp1[1][1]=3;
dp1[2][0]=1;
dp1[2][1]=2;
int i, j;
for(i=3;i<=n;++i)
{
for(j=0;j<3;++j)
{
if(j-1>=0) add(dp2[j], dp1[j-1]);
add(dp2[j], dp1[j]);
if(j+1<=2) add(dp2[j], dp1[j+1]);
}
memcpy(dp1, dp2, sizeof(dp1));
memset(dp2, 0, sizeof(dp2));
}
add(dp1[0], dp1[1]);
add(dp1[0], dp1[2]);
afis(dp1[0]);
return 0;
}