Pagini recente » Cod sursa (job #358360) | Cod sursa (job #446324) | Cod sursa (job #38406) | Cod sursa (job #1916993) | Cod sursa (job #2815858)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aliens.in");
ofstream fout("aliens.out");
const int MAX3 = 409;
const int MAX5 = 409;
const int MAXL = 1009;
const int mini = -0x3f3f3f3f;
struct str {
short x, y, z; };
short dp[2][MAX3 << 1 | 1][MAX5 << 1 | 1], ans[MAXL];
inline void mul(short a[MAXL], 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 n;
fin >> n;
for (int i = 0; i <= (MAX3 << 1); ++i)
for (int j = 0; j <= (MAX5 << 1); ++j)
dp[0][i][j] = mini;
dp[0][MAX3][MAX5] = 0;
for (int i = 1; i <= n; ++i) {
int x, y; str val = {0, 0, 0};
fin >> x >> y;
while (x % 2 == 0) ++val.x, x /= 2;
while (x % 3 == 0) ++val.y, x /= 3;
while (x % 5 == 0) ++val.z, x /= 5;
while (y % 2 == 0) --val.x, y /= 2;
while (y % 3 == 0) --val.y, y /= 3;
while (y % 5 == 0) --val.z, y /= 5;
for (int j = 0; j <= (MAX3 << 1); ++j)
for (int k = 0; k <= (MAX5 << 1); ++k)
dp[i & 1][j][k] = mini;
for (int j = 0; j <= (MAX3 << 1); ++j) {
for (int k = 0; k <= (MAX5 << 1); ++k) {
if (dp[(i - 1) & 1][j][k] == mini)
continue;
dp[i & 1][j][k] = max(dp[i & 1][j][k], dp[(i - 1) & 1][j][k]);
dp[i & 1][j + val.y][k + val.z] = max(dp[i & 1][j + val.y][k + val.z],
(short) (dp[(i - 1) & 1][j][k] + val.x));
} }
}
str val = {0, 0, 0};
for (int i = MAX3; i <= (MAX3 << 1); ++i) {
for (int j = MAX5; j <= (MAX5 << 1); ++j) {
if (dp[n & 1][i][j] < 0)
continue;
double val1 = log(2.0) * val.x + log(3.0) * val.y + log(5.0) * val.z,
val2 = log(2.0) * dp[n & 1][i][j] + log(3.0) * (i - MAX3) + log(5.0) * (j - MAX5);
if (val1 < val2)
val = {dp[n & 1][i][j], i - MAX3, j - MAX5};
} }
ans[0] = ans[1] = 1;
for (int i = 1; i <= val.x; ++i)
mul(ans, 2);
for (int i = 1; i <= val.y; ++i)
mul(ans, 3);
for (int i = 1; i <= val.z; ++i)
mul(ans, 5);
for (int i = ans[0]; i >= 1; --i)
fout << ans[i];
return 0;
}