Pagini recente » Cod sursa (job #2471149) | Cod sursa (job #2563843) | Cod sursa (job #2055279) | Cod sursa (job #984713) | Cod sursa (job #1582670)
#include <stdio.h>
#include <math.h>
#define EPS 0.0000001
#define MAXP1 400
#define MAXP2 400
#define INF 2000000000
#define MAXL 5000
int d[2][2 * MAXP1 + 1][2 * MAXP2 + 1];
int rez[MAXL], p;
inline int max2(int a, int b){
return a > b ? a : b;
}
inline int cmp(double x, double y){
if(x - y >= EPS)
return 1;
if(y - x >= EPS)
return -1;
return 0;
}
inline int ptr(int x, int k){
int r = 0;
while(x % k == 0){
x /= k;
r++;
}
return r;
}
inline void prod(int x){
int tr = 0, i;
for(i = 0; i < p; i++){
rez[i] = rez[i] * x + tr;
tr = rez[i] / 10;
rez[i] %= 10;
}
while(tr > 0){
rez[i] += tr % 10;
tr /= 10;
i++;
}
p = i;
}
int main(){
FILE *in = fopen("aliens.in", "r");
int n, x, y, st1 = MAXP1, dr1 = MAXP1, st2 = MAXP2, dr2 = MAXP2, a, b, c, lin, i, j, k;
fscanf(in, "%d", &n);
for(i = 0; i < 2 * MAXP1 + 1; i++)
for(j = 0; j < 2 * MAXP2 + 1; j++)
d[0][i][j] = d[1][i][j] = -INF;
d[1][MAXP1][MAXP2] = d[0][MAXP1][MAXP2] = 0;
for(i = 0; i < n; i++){
lin = i & 1;
fscanf(in, "%d%d", &x, &y);
a = b = c = 0;
a += ptr(x, 2) - ptr(y, 2);
b += ptr(x, 3) - ptr(y, 3);
c += ptr(x, 5) - ptr(y, 5);
if(st1 > st1 + b)
st1 += b;
if(dr1 < dr1 + b)
dr1 += b;
if(st2 > st2 + c)
st2 += c;
if(dr2 < dr2 + c)
dr2 += c;
for(j = st1; j <= dr1; j++){
for(k = st2; k <= dr2; k++){
d[lin][j][k] = max2(d[!lin][j][k], d[!lin][j - b][k - c] + a);
}
}
}
fclose(in);
int p1 = INF, p2 = INF;
for(i = MAXP1; i <= dr1; i++){
for(j = MAXP2; j <= dr2; j++){
if(d[lin][i][j] != -INF){
if(p1 == INF || (p1 != INF && d[lin][i][j] >= 0 && cmp(d[lin][i][j] * log(2) + (i - MAXP1) * log(3) + (j - MAXP2) * log(5), d[lin][p1][p2] * log(2) + (p1 - MAXP1) * log(3) + (p2 - MAXP2) * log(5)) == 1)){
p1 = i; p2 = j;
}
}
}
}
rez[0] = 1;
p = 1;
while(d[lin][p1][p2] > 0){
prod(2);
d[lin][p1][p2]--;
}
for(; p1 > MAXP1; p1--)
prod(3);
for(; p2 > MAXP2; p2--)
prod(5);
FILE *out = fopen("aliens.out", "w");
for(i = p - 1; i >= 0; i--)
fprintf(out, "%d", rez[i]);
fclose(out);
return 0;
}