Cod sursa(job #110161)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 25 noiembrie 2007 19:07:04
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAXN 51

int N;
int x[MAXN], y[MAXN], z[MAXN];

#define MAXV3 18
#define MAXV5 12

int bst[MAXV3 * MAXN * 2][MAXV5 * MAXN * 2];
#define bst( i, j ) bst[ (i) + MAXV3 * MAXN ][ (j) + MAXV5 * MAXN ]

int rez[512];

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

inline void print( int A[512] )
{
	for (int i = A[0]; i; i--)
		printf("%d", A[i]);
	printf("\n");
}

int main()
{
	freopen("aliens.in", "rt", stdin);
	freopen("aliens.out", "wt", stdout);

	scanf("%d", &N);
	for (int i = 0; i < N; i++)
	{
		int A, B;
		scanf("%d %d", &A, &B);
		for (; A % 2 == 0; A /= 2) x[i]++;
		for (; A % 3 == 0; A /= 3) y[i]++;
		for (; A % 5 == 0; A /= 5) z[i]++;

		for (; B % 2 == 0; B /= 2) x[i]--;
		for (; B % 3 == 0; B /= 3) y[i]--;
		for (; B % 5 == 0; B /= 5) z[i]--;
	}

	for (int j = -N * MAXV3; j <= N * MAXV3; j++)
		for (int k = -N * MAXV5; k <= N * MAXV5; k++)
			bst(j, k) = -0x3f3f3f3f;
	bst(0, 0) = 0;

	for (int i = 0; i < N; i++)
	{
		int jL, jR, jD;
		if (y[i] >= 0)
			jL = N * MAXV3, jR = -N * MAXV3, jD = -1;
		else
			jL = -N * MAXV3, jR = N * MAXV3, jD = 1;
		int kL, kR, kD;
		if (z[i] >= 0)
			kL = N * MAXV5, kR = -N * MAXV5, kD = -1;
		else
			kL = -N * MAXV5, kR = N * MAXV5, kD = 1;
	
		for (int j = jL; j != jR; j += jD)
			for (int k = kL; k != kR; k += kD)
			{
				if (bst(j, k) == -0x3f3f3f3f)
					continue;

				if (j + y[i] <= N * MAXV3 && k + z[i] <= N * MAXV5)
					if (bst(j, k) + x[i] > bst(j + y[i], k + z[i]))
						bst(j + y[i], k + z[i]) = bst(j, k) + x[i];
			}
	}

	double MAX = -1; int MAXx = -1, MAXy = -1, MAXz = -1;

	for (int Y = -N * MAXV3; Y <= N * MAXV3; Y++)
		for (int Z = -N * MAXV5; Z <= N * MAXV5; Z++)
		{
			int X = bst(Y, Z);
			if (X < 0 || Y < 0 || Z < 0) continue;

			double val = log(2) * X + log(3) * Y + log(5) * Z;
			if (val > MAX)
				MAX = val,
				MAXx = X,
				MAXy = Y,
				MAXz = Z;
		}

	rez[ rez[0] = 1 ] = 1;
	for (; MAXx; MAXx--) mul(rez, 2);
	for (; MAXy; MAXy--) mul(rez, 3);
	for (; MAXz; MAXz--) mul(rez, 5);

	print(rez);

	return 0;
}