Pagini recente » Cod sursa (job #2946938) | Cod sursa (job #1774123) | Cod sursa (job #1618906) | Cod sursa (job #1590253) | Cod sursa (job #2766680)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aliens.in");
ofstream fout("aliens.out");
const int MAXN = 50;
const int MAX3 = 18;
const int MAX5 = 12;
const int MAX_SUM_3 = MAXN * MAX3;
const int MAX_SUM_5 = MAXN * MAX5;
const int INF = 1e4;
const int LEN = 450;
int dp[1 + 2 * MAX_SUM_3][1 + 2 * MAX_SUM_5], p2, p3, p5, sol[LEN];
void upd(int x, int t) {
while (x % 2 == 0) {
p2 += t;
x >>= 1;
}
while (x % 3 == 0) {
p3 += t;
x /= 3;
}
while (x % 5 == 0) {
p5 += t;
x /= 5;
}
}
void max_self(int &x, int y) {
if (x < y)
x = y;
}
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 n;
fin >> n;
for (int i = 0; i <= 2 * MAX_SUM_3; ++i)
for (int j = 0; j <= 2 * MAX_SUM_5; ++j)
dp[i][j] = -INF;
dp[MAX_SUM_3][MAX_SUM_5] = 0;
int lo3, hi3, lo5, hi5;
lo3 = hi3 = MAX_SUM_3;
lo5 = hi5 = MAX_SUM_5;
for (int k = 0; k < n; ++k) {
int x, y;
fin >> x >> y;
p2 = p3 = p5 = 0;
upd(x, 1);
upd(y, -1);
if (p3 > 0) {
hi3 += p3;
if (p5 > 0) {
hi5 += p5;
for (int i = hi3; i - p3 >= lo3; --i)
for (int j = hi5; j - p5 >= lo5; --j)
max_self(dp[i][j], dp[i - p3][j - p5] + p2);
} else {
lo5 += p5;
for (int i = hi3; i - p3 >= lo3; --i)
for (int j = lo5; j - p5 <= hi5; ++j)
max_self(dp[i][j], dp[i - p3][j - p5] + p2);
}
} else {
lo3 += p3;
if (p5 > 0) {
hi5 += p5;
for (int i = lo3; i - p3 <= hi3; ++i)
for (int j = hi5; j - p5 >= lo5; --j)
max_self(dp[i][j], dp[i - p3][j - p5] + p2);
} else {
lo5 += p5;
for (int i = lo3; i - p3 <= hi3; ++i)
for (int j = lo5; j - p5 <= hi5; ++j)
max_self(dp[i][j], dp[i - p3][j - p5] + p2);
}
}
}
double best = -1;
int exp2 = 0, exp3 = 0, exp5 = 0;
for (int i = MAX_SUM_3; i <= 2 * MAX_SUM_3; ++i)
for (int j = MAX_SUM_5; j <= 2 * MAX_SUM_5; ++j)
if (dp[i][j] >= 0) {
double val = log(2) * dp[i][j] + log(3) * (i - MAX_SUM_3) + log(5) * (j - MAX_SUM_5);
if (val > best) {
best = val;
exp2 = dp[i][j];
exp3 = i - MAX_SUM_3;
exp5 = j - MAX_SUM_5;
}
}
sol[0] = sol[1] = 1;
for (int i = 0; i < exp2; ++i)
mul(sol, 2);
for (int i = 0; i < exp3; ++i)
mul(sol, 3);
for (int i = 0; i < exp5; ++i)
mul(sol, 5);
for (int i = sol[0]; i > 0; --i)
fout << sol[i];
fout << '\n';
fin.close();
fout.close();
return 0;
}