Cod sursa(job #253348)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 18:14:00
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
 #include <stdio.h>  
 #include <string.h>  
 #include <math.h>  
   
 const int MAXN = 51;  
 const int MAXlog3 = 18;  
 const int MAXlog5 = 12;  
 const int MAXV3 = MAXN * MAXlog3;  
 const int MAXV5 = MAXN * MAXlog5;  
   
 int N;  
 short x[MAXN], y[MAXN], z[MAXN];  
   
 short bst[MAXV3 * 2][MAXV5 * 2];  
 #define bst( i, j ) bst[ (i) + MAXV3 ][ (j) + MAXV5 ]  
   
 int rez[512];  
   
 inline void mul( int A[512], 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;  
 }  
   
 inline void print( int A[512] )  
 {  
     for (int i = A[0]; i; i--)  
         printf("%d", A[i]);  
     printf("\n");  
 }  
   
 int main()  
 {  
     freopen("aliens.in", "rt", stdin);  
     freopen("aliens.out", "wt", stdout);  
   
     scanf("%d", &N);  
     for (int i = 0; i < N; i++)  
     {  
         int A, B;  
         scanf("%d %d", &A, &B);  
         for (; A % 2 == 0; A /= 2) x[i]++;  
         for (; A % 3 == 0; A /= 3) y[i]++;  
         for (; A % 5 == 0; A /= 5) z[i]++;  
   
         for (; B % 2 == 0; B /= 2) x[i]--;  
         for (; B % 3 == 0; B /= 3) y[i]--;  
         for (; B % 5 == 0; B /= 5) z[i]--;  
     }  
   
     for (int j = -N * MAXlog3; j <= N * MAXlog3; j++)  
         for (int k = -N * MAXlog5; k <= N * MAXlog5; k++)  
             bst(j, k) = -32000;  
     bst(0, 0) = 0;  
     int MIN3 = 0, MAX3 = 0, MIN5 = 0, MAX5 = 0;  
   
     for (int i = 0; i < N; i++)  
     {  
         int jL, jR, jD;  
         if (y[i] >= 0)  
             jL = MAX3, jR = MIN3, jD = -1;  
         else  
             jL = MIN3, jR = MAX3, jD = 1;  
         int kL, kR, kD;  
         if (z[i] >= 0)  
             kL = MAX5, kR = MIN5, kD = -1;  
         else  
             kL = MIN5, kR = MAX5, kD = 1;  
       
         for (int j = jL; j != jR + jD; j += jD)  
             for (int k = kL; k != kR + kD; k += kD)  
             {  
                 if (bst(j, k) == -32000)  
                     continue;  
   
                 if (bst(j, k) + x[i] > bst(j + y[i], k + z[i]))  
                 {  
                     bst(j + y[i], k + z[i]) = bst(j, k) + x[i];  
   
                     if (j + y[i] > MAX3) MAX3 = j + y[i];  
                     if (j + y[i] < MIN3) MIN3 = j + y[i];  
   
                     if (k + z[i] > MAX5) MAX5 = k + z[i];  
                     if (k + z[i] < MIN5) MIN5 = k + z[i];  
                 }  
             }  
     }  
   
     double MAX = -1; int MAXx = -1, MAXy = -1, MAXz = -1;  
   
     for (int Y = 0; Y <= MAX3; Y++)  
         for (int Z = 0; Z <= MAX5; Z++)  
         {  
             int X = bst(Y, Z);  
             if (X < 0) continue;  
   
             double val = log(2) * X + log(3) * Y + log(5) * Z;  
             if (val > MAX)  
                 MAX = val,  
                 MAXx = X,  
                 MAXy = Y,  
                 MAXz = Z;  
         }  
   
     rez[ rez[0] = 1 ] = 1;  
     for (; MAXx; MAXx--) mul(rez, 2);  
     for (; MAXy; MAXy--) mul(rez, 3);  
     for (; MAXz; MAXz--) mul(rez, 5);  
   
     print(rez);  
   
     return 0;  
}