Cod sursa(job #484809)

Utilizator cont_de_testeCont Teste cont_de_teste Data 15 septembrie 2010 21:35:29
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
/* Mircea Pasoi */
#include <stdio.h>
#include <string.h>

#define MAX_N 105
#define MAX_i 10
#define FIN "munte3.in"
#define FOUT "munte3.out"
#define BASE 1000000000

int N, A[3][MAX_N][MAX_i];

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 += ( i <= A[0] ? A[i] : A[i] = 0 ) + ( i <= B[0] ? B[i] : B[i] = 0 ) ) % BASE ;
    }

    A[0] = i - 1;
}

void output ( int A[] ) {
    printf ( "%d" , A[A[0]] ) ;
    for ( int i = A[0] - 1; i ; --i ) {
        printf ( "%09d", A[i] ) ;
    }
}

int main(void)
{
    int i, i1, j, i2, i3;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &N);

    A[0][0][0] = A[0][0][1] = 1;
    for (i = 1; i < 2*N-1; i++)
    {
        i1 = i%3; i2 = (i+2)%3; i3 = (i+1)%3;
        for (j = 0; j < N; j++)
        {
            memcpy(A[i1][j], A[i2][j+1], sizeof(A[0][0]));
            if (j > 0) add(A[i1][j], A[i2][j-1]);
            if (i > 1 && j != 0) add(A[i1][j], A[i3][j]);
        }
    }
    output(A[(2*N-2)%3][0]);

    return 0;
}