Cod sursa(job #778430)

Utilizator danalex97Dan H Alexandru danalex97 Data 14 august 2012 18:41:01
Problema Bile2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.11 kb
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;

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

// Classes

# 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 ( 50 ) ;
}

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

const int Nmax = 1011;
const int Size = 111;

Mare S[2][Nmax], R[2][Nmax], First, Second ;
int N, D ;
char sir1[Size], sir2[Size] ;

int main() 
{
    freopen(FIN,"r",stdin); 
	freopen(FOU,"w",stdout);
    scanf("%d %d %s %s",&N,&D,sir1,sir2) ; First=sir1, Second=sir2 ;
	
    for ( int i = 1; i <= N; ++i ) R[1][i] = N - i + 1 ;
    S[1][0] = 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] , R[k][j] = ( j < N ) ? R[k][j] + R[k][j + 1] : R[k][j]; 
        Mare C = S[N & 1][i] - R[k][1], D = S[N & 1][i] ;
		if ( First * D < Second * C ) {	printf ( "%d", i ); return 0; }
    }
}