Pagini recente » Cod sursa (job #253767) | Cod sursa (job #2323255) | Cod sursa (job #879028) | Cod sursa (job #501316) | Cod sursa (job #497975)
Cod sursa(job #497975)
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;
#define max(a,b)((a)>(b)?(a):(b))
#define FIN "bile2.in"
#define FOU "bile2.out"
# define verf( X, i ) ( i <= X[0] ? X[i] : 0 )
# define A ( *this )
class Mare : protected vector < int > {
public :
Mare ( ) ;
Mare operator * ( Mare& ) ;
Mare operator + ( Mare& ) ;
void 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 ( 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 ) {
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 * 10 ;
}
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 /= 10 ) {
C[i] = ( t += verf ( A, i ) + verf ( B, i ) ) % 10 ;
}
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 /= 10)
C[i + j - 1] = ( t += C[i + j - 1] + verf ( A, i ) * verf ( B, j ) ) % 10;
if ( i + j - 2 > C[0] )
C[0] = i + j - 2;
}
return C ;
}
void Mare :: operator += ( Mare &B ) {
int i, t = 0;
for ( i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= 10 ) {
A[i] = ( t += verf ( A, i ) + verf ( B, i ) ) % 10 ;
}
A[0] = i - 1;
}
void Mare :: operator = ( int X ) {
for ( A[0] = 0; X ; X /= 10 ) {
A[ ++A[0] ] = X % 10 ;
}
}
void Mare :: operator = ( char *B ) {
A[0] = strlen ( B ) ;
for ( int i = A[0]; i ; --i )
A[i] = B[A[0] - i] - '0';
}
int N,D,i,g=0,nw=1,aux,j,k;
char a1[100], b1[100] ;
Mare N1,N2;
Mare comb[2][1001],nr[2][1001],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;
}
}
}