Cod sursa(job #1002980)

Utilizator poptibiPop Tiberiu poptibi Data 29 septembrie 2013 14:47:52
Problema Aliens Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

const int NMAX = 55, MAX_2 = 29, MAX_3 = 18, MAX_5 = 12;

int N, X[NMAX], Y[NMAX], Freq2[NMAX], Freq3[NMAX], Freq5[NMAX], Ans[NMAX * NMAX], Now[NMAX * NMAX];
bool Is[MAX_2 * 2 + 1][MAX_3 * 2 + 1][MAX_5 * 2 + 1], UPD[MAX_2 * 2 + 1][MAX_3 * 2 + 1][MAX_5 * 5 + 1];

void Mult(int A[NMAX * NMAX], int V)
{
    int i, T = 0;
    for(i = 1; i <= A[0] || T; i ++, T /= 10)
        A[i] = (T += A[i] * V) % 10;
    A[0] = i - 1;
}

int Comp(int A[NMAX * NMAX], int B[NMAX * NMAX])
{
    if(A[0] != B[0])
    {
        if(A[0] < B[0]) return -1;
        return 1;
    }
    for(int i = A[0]; i > 0; -- i)
        if(A[i] != B[i])
        {
            if(A[i] < B[i]) return -1;
            return 1;
        }
    return 0;
}

void Copy(int Source[NMAX * NMAX], int Destination[NMAX * NMAX])
{
    for(int i = 0; i <= Source[0]; ++ i)
        Destination[i] = Source[i];
}

bool Check(int X, int Y, int Z)
{
    return (0 <= X && X <= 2 * MAX_2 && 0 <= Y && Y <= 2 * MAX_3 && 0 <= Z && Z <= 2 * MAX_5);
}

int main()
{
    freopen("aliens.in", "r", stdin);
    freopen("aliens.out", "w", stdout);
    
    scanf("%i", &N);
    for(int i = 1; i <= N; ++ i)
    {
        scanf("%i %i", &X[i], &Y[i]);
        while(X[i] % 2 == 0) Freq2[i] ++, X[i] /= 2;
        while(X[i] % 3 == 0) Freq3[i] ++, X[i] /= 3;
        while(X[i] % 5 == 0) Freq5[i] ++, X[i] /= 5;
        while(Y[i] % 2 == 0) Freq2[i] --, Y[i] /= 2;
        while(Y[i] % 3 == 0) Freq3[i] --, Y[i] /= 3;
        while(Y[i] % 5 == 0) Freq5[i] --, Y[i] /= 5;
     //   printf("%i %i %i\n", Freq2[i], Freq3[i], Freq5[i]);
    }
    
    Is[MAX_2][MAX_3][MAX_5] = 1;
    
    for(int i = 1; i <= N; ++ i)
    {
        for(int j = 2 * MAX_2; j >= 0; --j)
            for(int k = 2 * MAX_3; k >= 0; -- k)
                for(int l = 2 * MAX_5; l >= 0; -- l)
                    if(Is[j][k][l] && Check(j + Freq2[i], k + Freq3[i], l + Freq5[i]) && !UPD[j][k][l])
                        UPD[j + Freq2[i]][k + Freq3[i]][l + Freq5[i]] = 1, /*printf("(%i, %i, %i) -> (%i, %i, %i)\n", j - MAX_2, k - MAX_3, l - MAX_5, j + Freq2[i] - MAX_2, k + Freq3[i] - MAX_3, l + Freq5[i] - MAX_5),*/Is[ j + Freq2[i] ][ k + Freq3[i] ][ l + Freq5[i] ] = 1;
        for(int j = 0; j <= 2 * MAX_2; ++ j)
            for(int k = 0; k <= 2 * MAX_3; ++ k)
                for(int l = 0; l <= 2 * MAX_5; ++ l)
                    UPD[j][k][l] = 0;
    }
    for(int i = MAX_2; i <= 2 * MAX_2; ++ i)
        for(int j = MAX_3; j <= 2 * MAX_3; ++ j)
            for(int k = MAX_5; k <= 2 * MAX_5; ++ k)
            {
                if(!Is[i][j][k]) continue;
             //   printf("%i %i %i\n", i - MAX_2, j - MAX_3, k - MAX_5);
                memset(Now, 0, sizeof(Now));
                Now[0] = Now[1] = 1;
                for(int l = 1; l <= i - MAX_2; ++ l) Mult(Now, 2);
                for(int l = 1; l <= j - MAX_3; ++ l) Mult(Now, 3);
                for(int l = 1; l <= k - MAX_5; ++ l) Mult(Now, 5);
               /* for(int l = Now[0]; l >= 1; -- l)
                    printf("%i", Now[l]);
                printf("\n");*/
                if(Comp(Ans, Now) == -1) 
                    Copy(Now, Ans);
            }
    
    for(int i = Ans[0]; i; -- i)
        printf("%i", Ans[i]);
    
    return 0;
}