Pagini recente » Cod sursa (job #3215468) | Cod sursa (job #11740) | Cod sursa (job #1088764) | Cod sursa (job #1136617) | Cod sursa (job #108718)
Cod sursa(job #108718)
Utilizator |
Mircea Pasoi domino |
Data |
23 noiembrie 2007 18:05:50 |
Problema |
Aliens |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
2.37 kb |
#include <stdio.h>
#include <math.h>
#define FIN "aliens.in"
#define FOUT "aliens.out"
#define MAX_P3 18
#define MAX_P5 12
#define SHIFT3 900
#define SHIFT5 600
#define MAX_LEN 10000
#define INF 127
#define max(a, b) ((a) > (b) ? (a) : (b))
int N, res[MAX_LEN];
char bst[2*SHIFT3+MAX_P3][2*SHIFT5+MAX_P5];
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(void)
{
int i, j, k, x, p2, p3, p5;
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;
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;
int l3, r3, s3, l5, r5, s5;
l3 = p3 < 0 ? -MAX_P3*i : MAX_P3*i;
r3 = -l3;
s3 = p3 < 0 ? +1 : -1;
l3 += SHIFT3; r3 += SHIFT3;
l5 = p5 < 0 ? -MAX_P5*i : MAX_P5*i;
r5 = -l5;
s5 = p5 < 0 ? +1 : -1;
l5 += SHIFT5; r5 += SHIFT5;
for (j = l3; j != r3+s3; j += s3)
for (k = l5; k != r5+s5; k += s5)
{
if (bst[j][k] == -INF) continue;
bst[j+p3][k+p5] = max(bst[j+p3][k+p5], bst[j][k]+p2);
}
}
double lg2 = log(2), lg3 = log(3), lg5 = log(5), max_val = -1;
for (i = MAX_P3*N+SHIFT3; i >= SHIFT3; --i)
for (j = MAX_P5*N+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;
}