Cod sursa(job #105371)

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

using namespace std;

#define maxim(a, b) ((a > b) ? a : b)
#define PII pair<short int, short 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[1005];
typedef struct { int x, y, z; } triplet;

int N, x[NMax], y[NMax], sz;
short int M[1830][1250], old[1830][1250];
PII q[1830*1250];
triplet E[NMax];
double bst; int dx = -1, dy = -1, dz = -1;
hugeNR R;

int get_m(int j, int k)
{
    if (j < 0) j = 1830 + j;
    if (k < 0) k = 1250 + k;
    return M[j][k];
}

void put_m(int j, int k, int val)
{
    if (j < 0) j = 1830 + j;
    if (k < 0) k = 1250 + k;
    M[j][k] = maxim(M[j][k], val);
}

void put_old(int j, int k, int val)
{
    if (j < 0) j = 1830 + j;
    if (k < 0) k = 1250 + k;
    old[j][k] = val;
}

int get_old(int j, int k)
{
    if (j < 0) j = 1830 + j;
    if (k < 0) k = 1250 + k;
    return old[j][k];
}

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, ok, new_size = 0;
    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++)
    {
        if (x[i] > 400000000 || y[i] > 400000000)
            for (;;);
            
        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;

        if (x[i] != 1 || y[i] != 1)
            for (;;);
    }

    sz = 1; q[1].f = q[1].s = 0;
    for (i = 0; i < 1830; i++)
        for (j = 0; j < 1250; j++)
            M[i][j] = old[i][j] = -32000;
    M[0][0] = 0;

    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= sz; j++)
            put_old(q[j].f, q[j].s, get_m(q[j].f, q[j].s));

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

            if (get_old(f3, f5) == -32000)
                q[++new_size] = make_pair(f3, f5);
            put_m(f3, f5, E[i].x + get_old(q[j].f, q[j].s));
        }
        sz = new_size;        
    }

    for (i = 1; i <= sz; i++)
    {
        if (q[i].f < 0 || q[i].s < 0) continue;
        
        ok = get_m(q[i].f, q[i].s);
        if (ok >= 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;
    }
    
    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;
}