Cod sursa(job #1701587)

Utilizator sucureiSucureiRobert sucurei Data 13 mai 2016 16:53:04
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <stdio.h>
#include <string.h>
#include <math.h>

const int MAXN = 51;
const int MAXlog3 = 18;
const int MAXlog5 = 12;
const int MAXV3 = MAXN * MAXlog3;
const int MAXV5 = MAXN * MAXlog5;

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

short bst[MAXV3 * 2][MAXV5 * 2];
#define bst( i, j ) bst[ (i) + MAXV3 ][ (j) + MAXV5 ]

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]--;
    }

    for (int j = -N * MAXlog3; j <= N * MAXlog3; j++)
        for (int k = -N * MAXlog5; k <= N * MAXlog5; k++)
            bst(j, k) = -32000;
    bst(0, 0) = 0;
    int MIN3 = 0, MAX3 = 0, MIN5 = 0, MAX5 = 0;

    for (int i = 0; i < N; i++)
    {
        int jL, jR, jD;
        if (y[i] >= 0)
            jL = MAX3, jR = MIN3, jD = -1;
        else
            jL = MIN3, jR = MAX3, jD = 1;
        int kL, kR, kD;
        if (z[i] >= 0)
            kL = MAX5, kR = MIN5, kD = -1;
        else
            kL = MIN5, kR = MAX5, kD = 1;

        for (int j = jL; j != jR + jD; j += jD)
            for (int k = kL; k != kR + kD; k += kD)
            {
                if (bst(j, k) == -32000)
                    continue;

                if (bst(j, k) + x[i] > bst(j + y[i], k + z[i]))
                {
                    bst(j + y[i], k + z[i]) = bst(j, k) + x[i];

                    if (j + y[i] > MAX3) MAX3 = j + y[i];
                    if (j + y[i] < MIN3) MIN3 = j + y[i];

                    if (k + z[i] > MAX5) MAX5 = k + z[i];
                    if (k + z[i] < MIN5) MIN5 = k + z[i];
                }
            }
    }

    double MAX = -1; int MAXx = -1, MAXy = -1, MAXz = -1;

    for (int Y = 0; Y <= MAX3; Y++)
        for (int Z = 0; Z <= MAX5; Z++)
        {
            int X = bst(Y, Z);
            if (X < 0) continue;

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