Pagini recente » Cod sursa (job #1980093) | Cod sursa (job #1882853) | Cod sursa (job #521712) | Cod sursa (job #2874612) | Cod sursa (job #497991)
Cod sursa(job #497991)
# 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 ( 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 * 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[100], b1[100] ;
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][2] ;//+ 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;
}
}
}