Cod sursa(job #116826)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 19 decembrie 2007 17:55:32
Problema Bile2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <stdio.h>
#include <string.h>

int N, D;

#define BAZA 10
#define OUTPUT_FORMAT "%d"
#define MAXL 1024

class huge 
{
public:
	int a[MAXL];
	huge() { memset( a, 0, sizeof(a) ); a[0] = 1; }
	huge( long long 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;
	for (p = 0; sir[p]; p++);
	for (p--, A.a[0] = 0; p >= 0; p--)
		A.a[ ++A.a[0] ] = sir[p] - '0';

	scanf(" %s ", sir);
	for (p = 0; sir[p]; p++);
	for (p--, B.a[0] = 0; p >= 0; p--)
		B.a[ ++B.a[0] ] = sir[p] - '0';

	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;
}