Cod sursa(job #105364)

Utilizator filipbFilip Cristian Buruiana filipb Data 17 noiembrie 2007 16:32:04
Problema Aliens Scor Ascuns
Compilator cpp Status done
Runda Marime 2.77 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>

using namespace std;

#define maxim(a, b) ((a > b) ? a : b)
#define mp make_pair
#define PII pair<int, int>
#define f first
#define s second
#define LN2 0.69314718
#define LN3 1.09861228
#define LN5 1.60943791
#define NMax 505

typedef int hugeNR[10005];
typedef struct { int x, y, z; } triplet;

int N, x[NMax], y[NMax], sz;
PII q[2000000];
triplet E[NMax];
double bst; int dx = -1, dy = -1, dz = -1;
hugeNR R;
map< PII, int > M, old;

void inm(hugeNR R, int nr)
{
    int i, t = 0;

    for (i = 1; i <= R[0] || t; i++, t /= 10)
        R[i] = (t += R[i] * nr) % 10;
    R[0] = i-1;
}

int main(void)
{
    int i, j, crt, prev, ok, new_size = 0, val;
    int f3, f5;
    double F;
    
    freopen("aliens.in", "r", stdin);
    freopen("aliens.out", "w", stdout);

    scanf("%d", &N);
    for (i = 1; i <= N; i++)
        scanf("%d %d", &x[i], &y[i]);

    for (i = 1; i <= N; i++)
    {
        while (x[i] % 2 == 0) E[i].x++, x[i] /= 2;
        while (x[i] % 3 == 0) E[i].y++, x[i] /= 3;
        while (x[i] % 5 == 0) E[i].z++, x[i] /= 5;

        while (y[i] % 2 == 0) E[i].x--, y[i] /= 2;
        while (y[i] % 3 == 0) E[i].y--, y[i] /= 3;
        while (y[i] % 5 == 0) E[i].z--, y[i] /= 5;        
    }

    sz = 1; q[1].f = q[1].s = 0;
    M[ mp(0, 0) ] = 0;

    for (i = 1; i <= N; i++)
    {
//        printf("%d %d\n", i, sz);
        
        old.clear();
        for (j = 1; j <= sz; j++)
            old[ q[j] ] = M[ q[j] ];

        for (j = 1, new_size = sz; j <= sz; j++)
        {
            f3 = q[j].f + E[i].y;
            f5 = q[j].s + E[i].z;

            if (!M[ mp(f3, f5) ])
            {
                M[ mp(f3, f5) ] = -9999999;
                q[++new_size] = mp(f3, f5);
            }
            
            val = E[i].x + old[ q[j] ];
            if (M[ mp(f3, f5) ] < val)
                M[ mp(f3, f5) ] = val;
        }
        sz = new_size;        
    }

    for (i = 1; i <= sz; i++)
        if (q[i].f >= 0 && q[i].s >= 0 && (ok = M[ q[i] ]) >= 0)
        {
            F = ok * LN2 + q[i].f * LN3 + q[i].s * LN5;
            if (F > bst)
               bst = F, dx = ok, dy = q[i].f, dz = q[i].s;
        }

    if (dx == -1)
    {
        printf("FARA SOLUTIE!\n");
        return 0;
    }

/*    for (i = 1; i <= sz; i++)
        if (q[i].f == 2 && q[i].s == 0)
            printf("DA %d\n", M[ q[i] ]);*/
    
    R[0] = R[1] = 1;
    for (i = 1; i <= dx; i++)
        inm(R, 2);
    for (i = 1; i <= dy; i++)
        inm(R, 3);
    for (i = 1; i <= dz; i++)
        inm(R, 5);
        
    for (i = R[0]; i >= 1; i--)
        printf("%d", R[i]);
    printf("\n");
        
    return 0;
}