Cod sursa(job #2815858)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 10 decembrie 2021 15:28:18
Problema Aliens Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX3 = 409;
const int MAX5 = 409;
const int MAXL = 1009;
const int mini = -0x3f3f3f3f;

struct str {
    short x, y, z; };
short dp[2][MAX3 << 1 | 1][MAX5 << 1 | 1], ans[MAXL];

inline void mul(short a[MAXL], 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 n;
    fin >> n;

    for (int i = 0; i <= (MAX3 << 1); ++i)
    for (int j = 0; j <= (MAX5 << 1); ++j)
        dp[0][i][j] = mini;

    dp[0][MAX3][MAX5] = 0;
    for (int i = 1; i <= n; ++i) {
        int x, y; str val = {0, 0, 0};
        fin >> x >> y;

        while (x % 2 == 0) ++val.x, x /= 2;
        while (x % 3 == 0) ++val.y, x /= 3;
        while (x % 5 == 0) ++val.z, x /= 5;

        while (y % 2 == 0) --val.x, y /= 2;
        while (y % 3 == 0) --val.y, y /= 3;
        while (y % 5 == 0) --val.z, y /= 5;

        for (int j = 0; j <= (MAX3 << 1); ++j)
        for (int k = 0; k <= (MAX5 << 1); ++k)
            dp[i & 1][j][k] = mini;

        for (int j = 0; j <= (MAX3 << 1); ++j) {
        for (int k = 0; k <= (MAX5 << 1); ++k) {
            if (dp[(i - 1) & 1][j][k] == mini)
                continue;

            dp[i & 1][j][k] = max(dp[i & 1][j][k], dp[(i - 1) & 1][j][k]);
            dp[i & 1][j + val.y][k + val.z] = max(dp[i & 1][j + val.y][k + val.z],
                                                  (short) (dp[(i - 1) & 1][j][k] + val.x));
        } }
    }

    str val = {0, 0, 0};
    for (int i = MAX3; i <= (MAX3 << 1); ++i) {
    for (int j = MAX5; j <= (MAX5 << 1); ++j) {
        if (dp[n & 1][i][j] < 0)
            continue;

        double val1 = log(2.0) * val.x + log(3.0) * val.y + log(5.0) * val.z,
               val2 = log(2.0) * dp[n & 1][i][j] + log(3.0) * (i - MAX3) + log(5.0) * (j - MAX5);

        if (val1 < val2)
            val = {dp[n & 1][i][j], i - MAX3, j - MAX5};
    } }

    ans[0] = ans[1] = 1;
    for (int i = 1; i <= val.x; ++i)
        mul(ans, 2);
    for (int i = 1; i <= val.y; ++i)
        mul(ans, 3);
    for (int i = 1; i <= val.z; ++i)
        mul(ans, 5);

    for (int i = ans[0]; i >= 1; --i)
        fout << ans[i];

    return 0;
}