Cod sursa(job #2736928)

Utilizator vansJos da pa perete vans Data 4 aprilie 2021 10:52:00
Problema Aliens Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 50, N3MAX = 50 * 18, N5MAX = 50 * 12;

int n, x, y, dp[2 * N5MAX + 40][2 * N3MAX + 40], a[10001], st5, dr5, st3, dr3;

void precalc() {
    for(int i = 0; i <= 2 * N5MAX + 30; ++i)
        for(int j = 0; j <= 2 * N3MAX + 30; ++j) dp[i][j] = -1e9;
    dp[st5 = dr5 = N5MAX][st3 = dr3 = N3MAX] = 0;
}

inline void nrm_mults(const int X) {
    int T = 0;
    for(int i = 1; i <= a[0]; ++i)
        a[i] = a[i] * X + T,
        T = a[i] / 10,
        a[i] %= 10;
    while(T) a[++a[0]] = T % 10, T /= 10;
}

int main()
{
    freopen("aliens.in", "r", stdin);
    freopen("aliens.out", "w", stdout);
    precalc(), scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%d%d", &x, &y);
        int p2 = 0, p3 = 0, p5 = 0;
        while(x % 2 == 0) x /= 2, ++p2;
        while(x % 3 == 0) x /= 3, ++p3;
        while(x % 5 == 0) x /= 5, ++p5;

        while(y % 2 == 0) y /= 2, --p2;
        while(y % 3 == 0) y /= 3, --p3;
        while(y % 5 == 0) y /= 5, --p5;

        if(p5 > 0) {
            dr5 += p5;
            if(p3 > 0) {
                dr3 += p3;
                for(int i = dr5; i - p5 >= st5; --i)
                    for(int j = dr3; j - p3 >= st3; --j)
                        dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
            } else {
                st3 += p3;
                for(int i = dr5; i - p5 >= st5; --i)
                    for(int j = st3; j - p3 <= dr3; ++j)
                        dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
            }
        } else {
            st5 += p5;
            if(p3 > 0) {
                st3 += p3;
                for(int i = st5; i - p5 <= dr5; ++i)
                    for(int j = dr3; j - p3 >= st3; --j)
                        dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
            } else {
                for(int i = st5; i - p5 <= dr5; ++i)
                    for(int j = st3; j - p3 <= dr3; ++j)
                        dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
            }
        }
    }
    double ans = -1;
    int ans2 = 0, ans3 = 0, ans5 = 0;
    for(int i = 0; i <= N5MAX; ++i)
        for(int j = 0; j <= N3MAX; ++j) {
            const int p2 = dp[i + N5MAX][j + N3MAX];
            if(p2 >= 0) {
                const double crt = log(2.0) * p2 + log(3.0) * j + log(5.0) * i;
                if(crt > ans)
                    ans = crt,
                    ans2 = p2, ans3 = j, ans5 = i;
            }
        }
    a[0] = a[1] = 1;
    for(int i = 1; i <= ans2; ++i) nrm_mults(2);
    for(int i = 1; i <= ans3; ++i) nrm_mults(3);
    for(int i = 1; i <= ans5; ++i) nrm_mults(5);
    for(int i = a[0]; i >= 1; --i) printf("%d", a[i]);
    return 0;
}