Cod sursa(job #2052288)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 30 octombrie 2017 12:57:55
Problema Aliens Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MAX3 = 409;
const int MAX5 = 409;
const int MAXL = 1009;

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

inline void mul(int 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;
    in >> n;

    memset(dp[0], -0x3f, sizeof dp[0]);

    dp[0][MAX3][MAX5] = 0;
    for (int i = 1; i <= n; ++i) {
        int x, y; str val = {0, 0, 0};
        in >> 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;

        memset(dp[i & 1], -0x3f, sizeof dp[i & 1]);
        for (int j = 0; j <= (MAX3 << 1); ++j) {
        for (int k = 0; k <= (MAX5 << 1); ++k) {
            if (dp[(i - 1) & 1][j][k] < -1e9) 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],
                                                  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)
        out << ans[i];

    return 0;
}