Cod sursa(job #196380)

Utilizator gcosminGheorghe Cosmin gcosmin Data 26 iunie 2008 10:27:23
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MP make_pair
#define ff first
#define ss second

#define NMAX 1010
#define OFF 1000
#define INF 2000

#define BASE 10000
#define FORMAT "%04d"

int N;

int nr[4];

short din[NMAX * 2][NMAX * 2];

int get_nr(int x, int p)
{
	int rez = 0;

	while (x % p == 0) {
		rez++;
		x /= p;
	}

	return rez;
}

int ABS(int x) { return (x < 0) ? -x : x; }
inline int MAX(int a, int b) { return (a > b) ? a : b; }

int rez[400];

void inm(int a[], int x)
{
	int i, t = 0;

	for (i = 1; i <= a[0] || t; i++, t /= BASE)
		a[i] = (t += a[i] * x) % BASE;

	a[0] = i - 1;
}

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

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

int main()
{
	int i, a, b, beg1, end1, beg2, end2, p1, p2, j, k, s1 = 0, s2 = 0, q;

	freopen("aliens.in", "r", stdin);
	freopen("aliens.out", "w", stdout);

	scanf("%d", &N);

	for (i = 0; i < NMAX * 2; i++)
		for (j = 0; j < NMAX * 2; j++) din[i][j] = -INF;

	din[OFF][OFF] = 0;

	for (i = 1; i <= N; i++) {
		scanf("%d %d", &a, &b);
		nr[0] = get_nr(a, 2) - get_nr(b, 2);
		nr[1] = get_nr(a, 3) - get_nr(b, 3);
		nr[2] = get_nr(a, 5) - get_nr(b, 5);

		s1 += ABS(nr[1]); s2 += ABS(nr[2]);
		q = MAX(s1, s2);

		if (nr[1] >= 0) beg1 = q, end1 = -q - 1, p1 = -1;
		else beg1 = -q, end1 = q + 1, p1 = 1;

		if (nr[2] >= 0) beg2 = q, end2 = -q - 1, p2 = -1;
		else beg2 = -q, end2 = q + 1, p2 = 1;

		for (j = beg1 + OFF; j != end1 + OFF; j += p1)
			for (k = beg2 + OFF; k != end2 + OFF; k += p2) {
				if (din[j][k] == -INF) continue;

				din[j + nr[1]][k + nr[2]] = MAX(din[j + nr[1]][k + nr[2]], din[j][k] + nr[0]);
			}
	}

	int ii = 0, jj = 0;
	double mx = 0, aux;
	double l2 = log(2);
	double l3 = log(3);
	double l5 = log(5);

	for (i = 0; i < NMAX * 2; i++)
		for (j = 0; j < NMAX * 2; j++) {
			if (din[i][j] == -INF) continue;

			if (i - OFF < 0 || j - OFF < 0) continue;
			if (din[i][j] < 0) continue;

			if ((aux = l2 * din[i][j] + l3 * (i - OFF) + l5 * (j - OFF)) > mx) {
				mx = aux;
				ii = i; jj = j;
			}
		}

//	printf("%d %d %d\n", ii - OFF, jj - OFF, din[ii][jj]);

	rez[0] = 1; rez[1] = 1;

	for (i = 1; i <= din[ii][jj]; i++) inm(rez, 2);
	for (i = 1; i <= ii - OFF; i++) inm(rez, 3);
	for (i = 1; i <= jj - OFF; i++) inm(rez, 5);

	print_nr(rez);

return 0;
}