Pagini recente » Cod sursa (job #2917548) | Cod sursa (job #745117) | Cod sursa (job #3226679) | Cod sursa (job #1144320) | Cod sursa (job #116830)
Cod sursa(job #116830)
#include <stdio.h>
#include <string.h>
int N, D;
#define BAZA 10000
#define OUTPUT_FORMAT "%04d"
#define MAXL 128
class huge
{
public:
int a[MAXL];
huge() { memset( a, 0, sizeof(a) ); a[0] = 1; }
huge( int x )
{
memset( a, 0, sizeof(a) );
if (x == 0) a[0] = 1;
for (; x; x /= BAZA)
a[ ++a[0] ] = x % BAZA;
}
huge operator + ( const huge &B )
{
huge C;
int i, t = 0;
for (i = 1; i <= a[0] || i <= B.a[0] || t; i++, t /= BAZA)
C.a[i] = (t += a[i] + B.a[i]) % BAZA;
C.a[0] = i - 1;
return C;
}
huge operator - ( const huge &B )
{
huge C;
int i, t = 0;
for (i = 1; i <= a[0]; i++)
{
C.a[i] = a[i] - B.a[i] - t;
t = C.a[i] < 0;
C.a[i] += t * BAZA;
}
for (C.a[0] = a[0]; C.a[0] > 1 && !C.a[ C.a[0] ]; C.a[0]--);
return C;
}
huge operator * ( const huge &B )
{
huge C; int i, j, t;
for (i = 1; i <= a[0]; i++)
{
for (j = 1, t = 0; j <= B.a[0] || t; j++, t /= BAZA)
C.a[i + j - 1] = (t += C.a[i + j - 1] + a[i] * B.a[j]) % BAZA;
if (i + j - 2 > C.a[0]) C.a[0] = i + j - 2;
}
return C;
}
huge& operator = ( const huge &B )
{
memcpy( a, B.a, sizeof(a) );
return (*this);
}
int operator < ( const huge &B )
{
if (a[0] < B.a[0]) return 1;
if (a[0] > B.a[0]) return 0;
for (int i = a[0]; i >= 1; i--)
if (a[i] != B.a[i])
return a[i] < B.a[i];
return 0;
}
void print() const
{
printf("%d", a[a[0]]);
for (int i = a[0] - 1; i >= 1; i--)
printf(OUTPUT_FORMAT, a[i]);
printf(" ");
}
};
#define MAXN 1024
huge nr[2][MAXN];
huge comb[2][MAXN];
char sir[128];
huge A, B;
int main()
{
freopen("bile2.in", "rt", stdin);
freopen("bile2.out", "wt", stdout);
scanf("%d %d", &N, &D);
scanf(" %s ", sir);
int p, p10 = 1, cif = 0;
for (p = 0; sir[p]; p++);
for (p--, A.a[0] = 0; p >= 0; p--)
{
cif += p10 * (sir[p] - '0');
p10 *= 10;
if (p10 == BAZA)
A.a[ ++A.a[0] ] = cif,
p10 = 1, cif = 0;
}
if (cif)
A.a[ ++A.a[0] ] = cif;
scanf(" %s ", sir);
p10 = 1; cif = 0;
for (p = 0; sir[p]; p++);
for (p--, B.a[0] = 0; p >= 0; p--)
{
cif += p10 * (sir[p] - '0');
p10 *= 10;
if (p10 == BAZA)
B.a[ ++B.a[0] ] = cif,
p10 = 1, cif = 0;
}
if (cif)
B.a[ ++B.a[0] ] = cif;
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];
}
huge C = comb[N & 1][i] - nr[step][1], D = comb[N & 1][i];
if (!(B * C < A * D))
{
printf("%d\n", i);
return 0;
}
}
return 0;
}