Cod sursa(job #2610356)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 4 mai 2020 19:21:35
Problema Aliens Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("aliens.in");
ofstream fout("aliens.out");

const short nmax = 50, l3 = 18 * 50, l5 = 12 * 50, inf = 30000, offset1 = 18 * 50, offset2 = 12 * 50;

short n, x, y, dp[2][2 * l3 + 5][2 * l5 + 5], ans1, ans2, v[5000];
double sol = 0;

int getPower(int a, int b)
{
    int contor = 0;
    while (a % b == 0)
    {
        ++contor;
        a = a / b;
    }
    return contor;
}

void inmul(int a)
{
    int t = 0;
    for (int i = 1; i <= v[0]; ++i)
    {
        v[i] = v[i] * a + t;
        t += v[i] / 10;
        v[i] %= 10;
    }
    while (t)
    {
        v[++v[0]] = t % 10;
        t /= 10;
    }
}

int main()
{
    fin >> n;
    short a = 0, b = 0;
    for (int j = 0; j <= l3 + l3; ++j)
        {
            for (int k = 0; k <= l5 + l5; ++k)
            {
                dp[0][j][k] = -inf;
            }
        }
    dp[0][l3][l5] = 0;
    for (int i = 1; i <= n; ++i)
    {
        fin >> x >> y;
        short p2 = getPower(x, 2) - getPower(y, 2);
        short p3 = getPower(x, 3) - getPower(y, 3);
        short p5 = getPower(x, 5) - getPower(y, 5);
        a = a + abs(p3);
        b = b + abs(p5);
        for (int j = 0; j <= l3 + l3; ++j)
        {
            for (int k = 0; k <= l5 + l5; ++k)
            {
                dp[i % 2][j][k] = -inf;
            }
        }
        for (int j = -a; j <= a; ++j)
        {
            for (int k = -b; k <= b; ++k)
            {
                if (dp[1 - i % 2][j + offset1][k + offset2] != -inf)
                {
                    dp[i % 2][j + offset1][k + offset2] = max(dp[i % 2][j + offset1][k + offset2], dp[1 - i % 2][j + offset1][k + offset2]);
                }
                if (j - p3 >= -l3 && k - p5 >= -l5 && dp[1 - i % 2][j - p3 + offset1][k - p5 + offset2] != -inf)
                {
                    if (p2 + dp[1 - i % 2][j - p3 + offset1][k - p5 + offset2] > dp[i % 2][j + offset1][k + offset2])
                    {
                        dp[i % 2][j + offset1][k + offset2] = p2 + dp[1 - i % 2][j - p3 + offset1][k - p5 + offset2];
                    }
                }
            }
        }
    }
    for (int i = 0; i <= l3; ++i)
    {
        for (int j = 0; j <= l5; ++j)
        {
            int p2 = dp[n % 2][i + offset1][j + offset2];
            if (p2 > 0)
            {
                double val = log(2.0) * p2 + log(3.0) * i + log(5.0) * j;
                if (val > sol)
                {
                    sol = val;
                    ans1 = i;
                    ans2 = j;
                }
            }
        }
    }
    v[0] = 1;
    v[1] = 1;
    int p2 = dp[n % 2][ans1 + offset1][ans2 + offset2];
    for (int i = 1; i <= p2; ++i) inmul(2);
    for (int i = 1; i <= ans1; ++i) inmul(3);
    for (int i = 1; i <= ans2; ++i) inmul(5);
    for (int i = v[0]; i >= 1; --i) fout << v[i];
    fin.close();
    fout.close();
    return 0;
}