Cod sursa(job #501855)

Utilizator SpiderManSimoiu Robert SpiderMan Data 16 noiembrie 2010 20:55:32
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.24 kb
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;

# define verf( X, i ) ( i <= X[0] ? X[i] : 0 )
# define A ( *this )

class Mare : protected vector < int > {
protected :
    static const int base = 1000000000, nbase = 9 ;
public :
    Mare ( ) ;
    Mare& operator = ( const Mare& ) ;
    void operator += ( Mare& ) ;
    void operator -= ( Mare& ) ;
    bool operator < ( Mare& ) ;
    void operator = ( int ) ;
    void operator = ( char* ) ;
    void afis ( void ) ;
    bool ac ( void ) ;
} ;

Mare :: Mare () {
    this -> resize ( 50 ) ;
}

void Mare :: operator += ( Mare &B ) {
    int i, t = 0;

    for ( i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= base ) {
        A[i] = ( t += verf ( A, i ) + verf ( B, i ) ) % base ;
    }

    A[0] = i - 1;
}

void Mare :: operator -= ( Mare &B ) {
    int t = 0;
    for ( int i = 1; i <= A[0]; ++i ) {
        t = ( A[i] -= verf ( B, i ) + t ) < 0 ;
        A[i] += t * base ;
    }
    for ( ; A[0] > 1 && !A[ A[0] ]; --A[0] ) ;
}

bool Mare :: operator < ( Mare &B ) {
    if ( A[0] < B[0] ) return true;
    else if ( A[0] > B[0] ) return false;

    for ( int i = A[0]; i > 0 ; --i )
        if ( A[i] < B[i] ) return true;
        else if ( A[i] > B[i] ) return false;

    return false;
}

void Mare :: operator = ( int X ) {
    for ( A[0] = 0; X ; X /= base ) {
        A[ ++A[0] ] = X % base ;
    }
}

Mare& Mare :: operator = ( const Mare &B ) {
    for ( int i = 0; i <= B[0]; ++i ) {
        A[i] = B[i] ;
    }
    return A ;
}

void Mare :: operator = ( char *X ) {
    A[0] = 0;
    for ( int h = strlen ( X ) ; h > 0 ; h -= nbase ) {
        ++A[0] ;
        for ( int i = max ( 0, h - nbase ) ; i < h; ++i ) {
            A[ A[0] ] = A[ A[0] ] * 10 + X[i] - '0' ;
        }
    }
}

bool Mare :: ac ( void ) {
    return ! ( A[0] == 1 && A[1] == 0 ) ;
}

void Mare :: afis ( void ) {
    printf ( "%d", A[ A[0] ] ) ;
    for ( int i = A[0] - 1; i ; --i ) {
        printf ( "%09d", A[i] ) ;
    }
    printf ( "\n" ) ;
}

# undef A

Mare V[105][2], K ;
char ch[100] ;
int N, A, B ;

void write ( void ) {
    freopen ( "pavare2.out", "w", stdout ) ;
    Mare sol = V[N][0] ;
    sol += V[N][1], sol.afis () ;
    for ( int _1 = 0, _2 = 0 ; K.ac () && N ; ) {
        if ( V[N][0] < K ) {
            printf ( "1" ) ;
            K -= V[N--][0], _1 = 0, ++_2 ;
        } else {
            printf ( "0" ) ;
            --N, ++_1, _2 = 0 ;
        }
        if ( _1 ) {
            V[N][0] = 0 ;
            for ( int i = 1; i <= N && i <= A - _1; ++i ) {
                V[N][0] += V[N - i][1] ;
            }
        } else {
            V[N][1] = 0 ;
            for ( int i = 1; i <= N && i <= B - _2; ++i ) {
                V[N][1] += V[N - i][0] ;
            }
        }
    }
}

int main ( void ) {
    fscanf ( fopen ( "pavare2.in", "r" ), "%d %d %d %s", &N, &A, &B, ch ) ;
    K = ch, V[0][1] = 1, V[0][0] = 1 ;
    for ( int i = 1; i <= N; ++i ) {
        for ( int j = 1; j <= A && j <= i; ++j ) {
            V[i][0] += V[i - j][1] ;
        }
        for ( int j = 1; j <= B && j <= i; ++j ) {
            V[i][1] += V[i - j][0] ;
        }
    }

    write () ;
}