Cod sursa(job #110144)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 25 noiembrie 2007 18:38:40
Problema Aliens Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

#define MAXN 64

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

#define stare pair< int, pair<int, int> >
#define X first
#define Y second.first
#define Z second.second
#define make_stare(a, b, c) make_pair( (a), make_pair((b), (c)) )

vector< stare > S[2], tmp;
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]--;
	}

	int step = 0;
	S[0].push_back( make_stare(0, 0, 0) );
	for (int i = 0; i < N; i++, step ^= 1)
	{
		sort( S[step].begin(), S[step].end() );
		S[step].resize( unique(S[step].begin(), S[step].end()) - S[step].begin() );

		size_t a, b;
		for (a = 0; a < S[step].size(); a++)
		{
			int ok = 1;
			for (b = a + 1; b < S[step].size() && ok; b++)
				if (S[step][b].X >= S[step][a].X && S[step][b].Y >= S[step][a].Y && S[step][b].Z >= S[step][a].Z)
					ok = 0;

			if (ok)
				tmp.push_back( S[step][a] );
		}

		S[ 1 ^ step ] = tmp;
		vector< stare > :: iterator it;
		for (it = tmp.begin(); it != tmp.end(); it++)
			S[ 1 ^ step ].push_back( make_stare( (*it).X + x[i], (*it).Y + y[i], (*it).Z + z[i] ) );
	}

	double MAX = -1; int MAXx = -1, MAXy = -1, MAXz = -1;
	vector< stare > :: iterator it;
	for (it = S[ step ].begin(); it != S[ step ].end(); it++)
	{
		if ((*it).X < 0 || (*it).Y < 0 || (*it).Z < 0) continue;

		double val = log(2) * (*it).X + log(3) * (*it).Y + log(5) * (*it).Z;
		if (val > MAX)
			MAX = val,
			MAXx = (*it).X,
			MAXy = (*it).Y,
			MAXz = (*it).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;
}