Pagini recente » Cod sursa (job #927932) | Cod sursa (job #585086) | Cod sursa (job #870101) | Cod sursa (job #3181745) | Cod sursa (job #497999)
Cod sursa(job #497999)
# 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 = 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 () {
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 ; --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;
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 ;
}
}
}