Cod sursa(job #919462)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 19 martie 2013 17:50:17
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;
  
const char *In = "bile2.in";
const char *Out = "bile2.out";
  
const int Nmax = 1011;
const int Size = 111;
int N, D ;
char sir1[Size], sir2[Size] ;
  
// 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 1;
    else if ( A[0] > B[0] ) return 0;
  
    for ( int i = A[0] ; i ; --i )
        if ( A[i] < B[i] ) return 1;
        else if ( A[i] > B[i] ) return 0;
  
    return 0 ;
}
  
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][Nmax], R[2][Nmax], First, Second ;
  
void Solve()
{
    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] , 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] ;
        Mare One=First * D;
        Mare Two=Second * C;
        if ( One < Two ) {   printf ( "%d", i ); return; }
    }
}
  
int main()
{
    freopen(In,"r",stdin);
    freopen(Out,"w",stdout);
      
    scanf("%d %d %s %s",&N,&D,sir1,sir2) ;
    First=sir1, Second=sir2 ;
      
    Solve();
    return 0;
}