Cod sursa(job #116811)

Utilizator wefgefAndrei Grigorean wefgef Data 19 decembrie 2007 17:06:25
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
/*
 * Author: Andrei Grigorean
 * Time Complexity: O(N^2 * BigNum)
 * Memory Complexity: O(N * BigNum)
*/

#include <cstdio>
#include <cstring>
#include <cassert>

const int Base = 10000;
const int Lmax = 128;
const int Nmax = 1024;

int N, D;
int X[Lmax], Y[Lmax];
int Comb[Lmax];
int A[Nmax][Lmax], B[Nmax][Lmax];

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 Substract(int A[], int B[]) {
	for (int i = 1; i <= A[0]; ++i) {
		if (A[i] < B[i]) {
			A[i] += Base;
			--A[i+1];
		}
		A[i] -= B[i];
	}
	while (A[0] && !A[A[0]]) --A[0];
}

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

void Multiply(int A[], int B[]) {
	int i, j, t, C[Lmax];
	memset(C, 0, sizeof(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] + A[i]*B[j]) % Base;
		if (i+j-2 > C[0]) C[0] = i+j-2;
	}
	memcpy(A, C, sizeof(C));
}

void Divide(int A[], int B) {
	int i, t = 0;
	for (i = A[0]; i; --i, t %= B)
		A[i] = (t = t*Base + A[i]) / B;
	while (A[0] && !A[A[0]]) --A[0];
}

void Atrib(int A[], int B[]) {
	for (int i = 0; i < Lmax; ++i)
		A[i] = 0;
	for (int i = 0; i <= B[0]; ++i)
		A[i] = B[i];
}

int Greater(int A[], int B[]) {
	if (A[0] != B[0]) return A[0] > B[0];
	for (int i = A[0]; i; --i) {
		if (A[i] > B[i]) return 1;
		if (A[i] < B[i]) return 0;
	}
	return 1;
}

void Atrib(int A[], char s[]) {
	int Length = strlen(s);
	A[0] = 1;
	for (int i = Length-1, pow = 1; i >= 0; --i) {
		A[A[0]] += pow*(s[i]-'0');
		if ((pow *= 10) == 10000 && i > 0) {
			pow = 1;
			++A[0];
		}
	}
}

void ReadData() {	
	char buf[128];

	assert(scanf("%d %d\n", &N, &D) == 2);
	assert(1 <= N && N <= 1000);
	assert(1 <= D && D < N);

	assert(scanf("%s", buf) == 1);
	assert(strlen(buf) <= 64);
	Atrib(X, buf);

	assert(scanf("%s", buf) == 1);
	assert(strlen(buf) <= 64);
	Atrib(Y, buf);
}

void Solve() {
	int Aux[Lmax];

	Atrib(Aux, Y);
	Substract(Aux, X);
	Atrib(X, Aux);

	for (int i = 1; i <= N; ++i)
		A[i][ A[i][0] = 1 ] = i;

	Comb[0] = 1; Comb[1] = N;

	for (int i = 2; i <= N; ++i) {

		for (int j = D+2; j <= N; ++j)
			Atrib(B[j], A[j-D-1]);
		for (int j = D+2; j <= N; ++j)
			Add(B[j], B[j-1]);

		Multiply(Comb, N-i+1);
		Divide(Comb, i);

		int C1[Lmax], C2[Lmax];
		Atrib(C1, Comb); Multiply(C1, X);
		Atrib(C2, B[N]); Multiply(C2, Y);

		if (Greater(C1, C2)) {
			printf("%d\n", i);
			return;
		}

		memcpy(A, B, sizeof(B));
		memset(B, 0, sizeof(B));
	}
}

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

	ReadData();
	Solve();
}