Cod sursa(job #2595146)

Utilizator betybety bety bety Data 7 aprilie 2020 11:35:11
Problema Aliens Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <cstdio>
#include <cmath>
#define FIN "aliens.in"
#define FOUT "aliens.out"
#define MAX_P3 18
#define MAX_P5 12
#define SHIFT3 950
#define SHIFT5 650
#define MAX_LEN 10000
#define INF 127
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
int N,  res[MAX_LEN];
char bst[2*SHIFT3+1][2*SHIFT5+1];
void mul(int a[], 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()
{
    int i, j, k, jj, kk, x, p2, p3, p5;
    int l3, r3, s3, l5, r5, s5, min3, min5, max3, max5;
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);
    scanf("%d", &N);
    for (i = 0; i <= 2*SHIFT3; ++i)
        for (j = 0; j <= 2*SHIFT5; ++j)
            bst[i][j] = -INF;
    bst[SHIFT3][SHIFT5] = 0;
    min3 = max3 = min5 = max5 = 0;
    for (i = 0; i < N; ++i)
    {
        scanf("%d", &x);
        for (p2 = 0; !(x%2); x /= 2) ++p2;
        for (p3 = 0; !(x%3); x /= 3) ++p3;
        for (p5 = 0; !(x%5); x /= 5) ++p5;
        scanf("%d", &x);
        for (; !(x%2); x /= 2) --p2;
        for (; !(x%3); x /= 3) --p3;
        for (; !(x%5); x /= 5) --p5;
        l3 = p3 < 0 ? min3 : max3;
        r3 = p3 < 0 ? max3 : min3;
        s3 = p3 < 0 ? +1 : -1;
        l3 += SHIFT3; r3 += SHIFT3;
        l5 = p5 < 0 ? min5 : max5;
        r5 = p5 < 0 ? max5 : min5;
        s5 = p5 < 0 ? +1 : -1;
        l5 += SHIFT5; r5 += SHIFT5;
        for (j = l3, jj = l3+p3; j != r3+s3; j += s3, jj += s3)
            for (k = l5, kk = l5+p5; k != r5+s5; k += s5, kk += s5)
            {
                if (bst[j][k] == -INF) continue;
                if (bst[jj][kk] < (x = bst[j][k]+p2))
                    bst[jj][kk] = x;
            }
        min3 = min(min3, min3+p3);
        max3 = max(max3, max3+p3);
        min5 = min(min5, min5+p5);
        max5 = max(max5, max5+p5);
    }
    double lg2 = log(2), lg3 = log(3), lg5 = log(5), max_val = -1;
    for (i = max3+SHIFT3; i >= SHIFT3; --i)
        for (j = max5+SHIFT5; j >= SHIFT5; --j)
        {
            if (bst[i][j] < 0) continue;
            double t = (i-SHIFT3)*lg3+(j-SHIFT5)*lg5+bst[i][j]*lg2;
            if (max_val < t)
            {
                max_val = t;
                p2 = bst[i][j];
                p3 = i-SHIFT3;
                p5 = j-SHIFT5;
            }
        }
    res[0] = res[1] = 1;
    for (i = 1; i <= p2; ++i) mul(res, 2);
    for (i = 1; i <= p3; ++i) mul(res, 3);
    for (i = 1; i <= p5; ++i) mul(res, 5);
    for (i = res[0]; i > 0; --i)
        printf("%d", res[i]);
    printf("\n");
    return 0;
}