Cod sursa(job #122840)

Utilizator victorsbVictor Rusu victorsb Data 13 ianuarie 2008 19:28:13
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <cstdio>
#include <cstring>

#define Nmax 1024
#define BASE 10000
#define Lmax 100
#define ll long long
#define MAX(a,b) ((a) >= (b) ? (a) : (b))

int n, m;
int a[Lmax], b[Lmax];
int c[2][Nmax][Lmax];
int d[2][Nmax][Lmax];

void citire()
{
	int i, j, l;
	char s[Lmax];

	scanf("%d %d\n", &n, &m);

	scanf("%s\n", s);
	l = strlen(s);
	for (i = 1; i <= l; i += 4)
	{
		++a[0];
		for (j = 3; j >= 0; --j)
			if (l - i - j >= 0)
				a[a[0]] = a[a[0]] * 10 + s[l - i - j] - '0';
	}
 
	scanf("%s\n", s);
	l = strlen(s);
	for (i = 1; i <= l; i += 4)
	{
		++b[0];
		for (j = 3; j >= 0; --j)
			if (l - i - j >= 0)
				b[b[0]] = b[b[0]] * 10 + s[l - i - j] - '0';
	}
}

void scrie(int a[])
{
	int i;

	printf("%d", a[a[0]]);
	for (i = a[0] - 1; i >= 1; --i)
		printf("%.4d", a[i]);
	printf("\n");
} 

void ATRIB(int A[], int B)
{
	do
	{
		A[++A[0]] = B % BASE;
		B /= BASE;
	}
	while (B);
}

inline void ADD(int A[], int B[])
{
	int i, t = 0;
	for (i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= BASE)
		A[i] = (t += A[i] + B[i]) % BASE;
	A[0] = i - 1;
}

void MUL(int A[], int B[])
{
	int i, j, t, C[Lmax];

	memset(C, 0, sizeof(C));
	for (i = 1; i <= A[0]; ++i)
	{
		t = 0;
		for (j = 1; j <= B[0] || t; ++j, t /= BASE)
			C[i + j - 1] = (t += C[i + j - 1] + A[i] * B[j]) % BASE;
		if (i + j - 2 > C[0])
			C[0] = i + j - 2;
	}

	memcpy(A, C, sizeof(C));
}

void SUB(int A[], int B[])
{
	int i, t = 0;

	for (i = 1; i <= A[0]; ++i)
		A[i] += (t = (A[i] -= B[i] + t) < 0) * BASE;
	while (A[0] && !A[A[0]]) --A[0];
}

int cmp(int A[], int B[])
{
	int i;

	if (A[0] > B[0]) return 1;
	if (A[0] < B[0]) return -1;
	for (i = A[0]; i >= 1; --i)
		if (A[i] > B[i]) return 1;
		else if (A[i] < B[i]) return -1;
	return 0;
}

void solve()
{
	int i, j, step = 1, c0;
	int v1[Lmax], v2[Lmax];

	ATRIB(c[0][0], 1);
    for (i = 1; i <= n; ++i, step = !step)
	{
		memset(c[step], 0, sizeof(c[step]));
		ATRIB(c[step][0], 1);
		for (j = 1; j <= n; ++j)
		{
			ADD(c[step][j], c[!step][j - 1]);
			ADD(c[step][j], c[!step][j]);
		}
	}
	c0 = !step;

    for (i = 0; i <= n; ++i)
		ATRIB(d[0][i], 1);

	step = 1;
	for (i = 1; i <= n; ++i, step = !step)
	{
		memset(d[step], 0, sizeof(d[step]));
		for (j = 1; j <= n; ++j)
		{
			ADD(d[step][j], d[step][j - 1]);
		   	ADD(d[step][j], d[!step][MAX(j - m - 1, 0)]);
		}

        memcpy(v1, c[c0][i], sizeof(v1));
		SUB(v1, d[step][n]);
		MUL(v1, b);

		memcpy(v2, c[c0][i], sizeof(v2));
		MUL(v2, a);
		if (cmp(v1, v2) >= 0)
		{
			printf("%d\n", i);
			break;
		}
	}
}

int main()
{
	freopen("bile2.in", "r", stdin);
	freopen("bile2.out", "w", stdout);

	citire();
	solve();

	return 0;
}