Cod sursa(job #498003)

Utilizator SpiderManSimoiu Robert SpiderMan Data 3 noiembrie 2010 20:45:38
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;

const char *FIN = "bile2.in", *FOU = "bile2.out" ;

# 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 * ( Mare& ) ;
    Mare operator + ( Mare& ) ;
    bool operator < ( const Mare& ) ;
    void operator = ( int ) ;
    void operator = ( char* ) ;
    Mare operator - ( Mare& ) ;
    Mare& operator = ( const Mare& ) ;
} ;

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

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

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

    return C ;
}

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

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

    return C ;
}

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

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

    return false ;
}

Mare Mare :: operator * ( Mare &B ) {
    Mare C ;
    for ( int i = 1, j; i <= A[0]; ++i ) {
        long long t = 0 ;
        for ( j = 1; j <= B[0] || t; j++, t /= base )
            C[i + j - 1] = ( t += C[i + j - 1] + 1LL * verf ( A, i ) * verf ( B, j ) ) % base;
        if ( i + j - 2 > C[0] )
            C[0] = i + j - 2;
    }

    return C ;
}

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

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' ;
        }
    }
}

Mare S[2][1005], R[2][1005], N1, N2 ;
int N, D ;
char sir1[100], sir2[100] ;

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    scanf ( "%d %d %s %s", &N, &D, sir1, sir2 ) ;

    N1 = sir1, N2 = sir2 ;

    for ( int i = 1; i <= N; ++i ) {
        R[1][i] = N - i + 1 ;
    }

    S[1][0] = 1, S[1][1] = 1;
    for ( int i = 2; i <= N; ++i ) {
        S[i & 1][0] = 1 ;
        for ( int j = 1; j <= i; ++j ) {
            S[i & 1][j] = S[i - 1 & 1][j] + S[i - 1 & 1][j - 1] ;
        }
    }

    for ( int i = 2, k = 0; i <= N; ++i, k ^= 1 ) {
        for ( int j = N; j ; --j ) {
            R[k][j] = R[k ^ 1][j + D + 1] ;
            if ( j < N ) {
                R[k][j] = R[k][j] + R[k][j + 1] ;
            }
        }

        Mare C = S[N & 1][i] - R[k][1], D = S[N & 1][i] ;

        if ( N1 * D < N2 * C ) {
            printf ( "%d", i ) ;
            return 0 ;
        }
    }
}