Cod sursa(job #497994)

Utilizator cont_de_testeCont Teste cont_de_teste Data 3 noiembrie 2010 20:30:02
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.39 kb
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;

#define FIN "bile2.in"
#define FOU "bile2.out"

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

inline int trans ( char *X, int h) // transformam o parte de cate *nbase* sa punem in vector
{
    int rez = 0, j = 0;

    if (h - 4 > 0) j = h - 4;

    for (int i = j ; i < h; ++i)
        rez = rez * 10 + X[i] - '0';

    return rez;
}

class Mare : protected vector < int > {
protected :
    static const int base = 10000, nbase = 4 ;
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 () { // A = 0
    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 ) {
    int t = 0;
    Mare C = A;
    for ( int i = 1; 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 > 0; --i )
        if ( A[i] < B[i] ) return true;
        else if ( A[i] > B[i] ) return false;

    return false ;
}

Mare Mare :: operator * ( Mare &B ) {
    int i, j, t ;
    Mare C ;
    for ( i = 1; i <= A[0]; ++i ) {
        for (t = 0, j = 1; j <= B[0] || t; j++, t /= base)
            C[i + j - 1] = ( t += C[i + j - 1] + 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;
    int h = strlen(X) ;
    while (h > 0)
        A[++A[0]] = trans ( X, h ), h -= nbase ;
}

int N,D,i,g=0,nw=1,aux,j,k;
char a1[128], b1[128] ;
Mare N1,N2;
Mare comb[2][1005],nr[2][1005],sum;

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;
    scanf("%d %d %s %s",&N,&D,a1,b1);
    N1 = a1, N2 = b1 ;
    for (int i = 1; i <= N; i++)
        nr[1][i] = N - i + 1;

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

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

        Mare C = comb[N & 1][i] - nr[step][1], D = comb[N & 1][i];

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