Cod sursa(job #109546)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 25 noiembrie 2007 11:43:04
Problema Aliens Scor 30
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 1.93 kb
#include <stdio.h>
#include <math.h>
#include <set>
#include <vector>

using namespace std;

const int N_MAX = 56;

set <pair <int, pair <int, int> > > v[2];

int sus[N_MAX], jos[N_MAX];

void fac(int X, int &nr2, int &nr3, int &nr5)
{
	nr2 = 0, nr3 = 0, nr5 = 0;

	while (X % 2 == 0) {
		nr2 ++;
		X /= 2;
	}
	while (X % 3 == 0) {
		nr3 ++;
		X /= 3;
	}
	while (X % 5 == 0) {
		nr5 ++;
		X /= 5;
	}
}

char rez[512];

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


int main()
{
	freopen("aliens.in", "r", stdin);
#ifndef _SCREEN_
	freopen("aliens.out", "w", stdout);
#endif

	int N, i;
	scanf("%d\n", &N);
	for (i = 1; i <= N; i ++) {
		scanf("%d %d\n", &sus[i], &jos[i]);
	}

	v[0].insert(make_pair(0, make_pair(0, 0)));
	int nr2s, nr3s, nr5s, nr2j, nr3j, nr5j;
	int z, x, y;

	int poz = 1;

	set <pair <int, pair <int, int> > >::iterator it, sf;

	for (i = 1; i <= N; i ++) {

		fac(sus[i], nr2s, nr3s, nr5s);
		fac(jos[i], nr2j, nr3j, nr5j);
		nr2s -= nr2j, nr3s -= nr3j, nr5s -= nr5j;

		for (it = v[poz ^ 1].begin(); it != v[poz ^ 1].end(); ++ it) {

			x = (*it).first;
			y = (*it).second.first;
			z = (*it).second.second;

			v[poz].insert(make_pair(x + nr2s, make_pair(y + nr3s, z + nr5s)));
			v[poz].insert(make_pair(x, make_pair(y, z)));
		}

		poz ^= 1;
		v[poz].clear();
	}

	poz ^= 1;
	double sum = 0;
	int mx = 0, my = 0, mz = 0;
	for (it = v[poz].begin(); it != v[poz].end(); ++ it) {

		x = (*it).first;
		y = (*it).second.first;
		z = (*it).second.second;

		if (log(2) * x + log(3) * y + log(5) * z > sum && x >= 0 && y >= 0 && z >= 0) {
			sum = log(2) * x + log(3) * y + log(5) * z;
			mx = x, my = y, mz = z;
		}
	}

	rez[0] = 1, rez[1] = 1;
	for (i = 1; i <= mx; i ++) mul(rez, 2);
	for (i = 1; i <= my; i ++) mul(rez, 3);
	for (i = 1; i <= mz; i ++) mul(rez, 5);

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

	return 0;
}