Cod sursa(job #733553)

Utilizator danalex97Dan H Alexandru danalex97 Data 12 aprilie 2012 14:56:55
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.46 kb
/*
#include <fstream>
#include <cmath>
using namespace std;

ifstream F("aliens.in");
ofstream G("aliens.out");

#define Cl(x) x.close();
inline void CloseFiles() {Cl(F)Cl(G)} 

#define oo 400000111
#define max(a,b) ( ( a>b ) ? a : b )
#define min(a,b) ( ( a<b ) ? a : b )

#define Dim 55
#define Max3 950
#define Max5 650
int Pwr2[Dim],Pwr3[Dim],Pwr5[Dim];
int N,X,Y;
int Mat[Dim][Max3][Max5];
int lim3,lim5,res[Max3];

void mul(int a[], 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;
}

int main(void)
{
	lim3=lim5=-oo;
	
	F>>N;
	for (int i=1;i<=N;++i)
	{
		F>>X>>Y;
		
		while ( !X%2 ) X/=2,++Pwr2[i];
		while ( !X%3 ) X/=3,++Pwr3[i];
		while ( !X%5 ) X/=5,++Pwr5[i];
		
		while ( !Y%2 ) Y/=2,--Pwr2[i];
		while ( !Y%3 ) Y/=3,--Pwr3[i];
		while ( !Y%5 ) Y/=5,--Pwr5[i];
		
		lim3=max(lim3,Pwr3[i]);
		lim5=max(lim5,Pwr5[i]);
	}
	
	for (int i=1;i<=N;++i)
		for (int j=1;j<=lim3;++j)
			for (int ii=1;ii<=lim5;++ii)
				Mat[i][j][ii]=max( Mat[i-1][j][ii], Mat[i-1][ j-Pwr3[i] ][ ii-Pwr5[i]+Pwr2[i] ] );
	
	double lg2=log(2),lg3=log(3),lg5=log(5),Max=-1;
	int rez2,rez3,rez5;
	
	for (int i=1;i<=N;++i)
		for (int j=1;j<=lim3;++j)
			for (int ii=1;ii<=lim5;++ii)
			{
				if ( Mat[i][j][ii] < 0 ) continue;
				
				double Val=lg2*Mat[i][j][ii]+lg3*j+lg5*ii;
				
				if ( Val < Max )
				{
					Max=Val;
					rez2=Mat[i][j][ii];
					rez3=j;
					rez5=ii;
				}
			}
	
	res[0] = res[1] = 1;
    for (int i = 1; i <= rez2; ++i) mul(res, 2);
    for (int i = 1; i <= rez3; ++i) mul(res, 3);
    for (int i = 1; i <= rez5; ++i) mul(res, 5);
    for (int i = res[0]; i > 0; --i)
        G<<res[i];
	G<<"\n";
	
	CloseFiles();
}
*/

#include <cstdio>
#include <cmath>
using namespace std;

#define FIN "aliens.in"
#define FOUT "aliens.out"

#define MAX_P3 18
#define MAX_P5 12
#define SHIFT3 950
#define SHIFT5 650

#define MAX_LEN 10000
#define oo 127

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

int N,  res[MAX_LEN];
char bst[2*SHIFT3+1][2*SHIFT5+1];

void mul(int a[], 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;
}

int main(void)
{
    int i, j, k, jj, kk, x, p2, p3, p5;
    int l3, r3, s3, l5, r5, s5, min3, min5, max3, max5;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &N);
    for (i = 0; i <= 2*SHIFT3; ++i)
        for (j = 0; j <= 2*SHIFT5; ++j)
            bst[i][j] = -oo;
    bst[SHIFT3][SHIFT5] = 0;
    min3 = max3 = min5 = max5 = 0;
    for (i = 0; i < N; ++i)
    {
        scanf("%d", &x);
        for (p2 = 0; !(x%2); x /= 2) ++p2;
        for (p3 = 0; !(x%3); x /= 3) ++p3;
        for (p5 = 0; !(x%5); x /= 5) ++p5;
        scanf("%d", &x);
        for (; !(x%2); x /= 2) --p2;
        for (; !(x%3); x /= 3) --p3;
        for (; !(x%5); x /= 5) --p5;
        
        l3 = p3 < 0 ? min3 : max3; 
        r3 = p3 < 0 ? max3 : min3;
        s3 = p3 < 0 ? +1 : -1;
        l3 += SHIFT3; r3 += SHIFT3;

        l5 = p5 < 0 ? min5 : max5; 
        r5 = p5 < 0 ? max5 : min5; 
        s5 = p5 < 0 ? +1 : -1;
        l5 += SHIFT5; r5 += SHIFT5;

        for (j = l3, jj = l3+p3; j != r3+s3; j += s3, jj += s3)
            for (k = l5, kk = l5+p5; k != r5+s5; k += s5, kk += s5)
            {
                if (bst[j][k] == -oo) continue;
                if (bst[jj][kk] < (x = bst[j][k]+p2))
                    bst[jj][kk] = x;
            }
        
        min3 = min(min3, min3+p3);
        max3 = max(max3, max3+p3);
        min5 = min(min5, min5+p5);
        max5 = max(max5, max5+p5);
    }

    double lg2 = log(2), lg3 = log(3), lg5 = log(5), max_val = -1;
    for (i = max3+SHIFT3; i >= SHIFT3; --i)
        for (j = max5+N+SHIFT5; j >= SHIFT5; --j)
        {
            if (bst[i][j] < 0) continue;
            double t = (i-SHIFT3)*lg3+(j-SHIFT5)*lg5+bst[i][j]*lg2;
            if (max_val < t)
            {
                max_val = t;
                p2 = bst[i][j];
                p3 = i-SHIFT3;
                p5 = j-SHIFT5;
            }
        }

    res[0] = res[1] = 1;
    for (i = 1; i <= p2; ++i) mul(res, 2);
    for (i = 1; i <= p3; ++i) mul(res, 3);
    for (i = 1; i <= p5; ++i) mul(res, 5);
    for (i = res[0]; i > 0; --i)
        printf("%d", res[i]);
    printf("\n");

    return 0;
}