Pagini recente » Cod sursa (job #1161318) | Cod sursa (job #1294257) | Cod sursa (job #3225258) | Cod sursa (job #573028) | Cod sursa (job #2736931)
#include <bits/stdc++.h>
using namespace std;
const int N3MAX = 50 * 18, N5MAX = 50 * 12;
int n, x, y, dp[2 * N5MAX + 40][2 * N3MAX + 40], a[10001], st5, dr5, st3, dr3;
void precalc() {
for(int i = 0; i <= 2 * N5MAX + 30; ++i)
for(int j = 0; j <= 2 * N3MAX + 30; ++j) dp[i][j] = -1e9;
dp[st5 = dr5 = N5MAX][st3 = dr3 = N3MAX] = 0;
}
inline void nrm_mults(const int X) {
int T = 0;
for(int i = 1; i <= a[0]; ++i)
a[i] = a[i] * X + T,
T = a[i] / 10,
a[i] %= 10;
while(T) a[++a[0]] = T % 10, T /= 10;
}
int main()
{
freopen("aliens.in", "r", stdin);
freopen("aliens.out", "w", stdout);
precalc(), scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d%d", &x, &y);
int p2 = 0, p3 = 0, p5 = 0;
while(x % 2 == 0) x /= 2, ++p2;
while(x % 3 == 0) x /= 3, ++p3;
while(x % 5 == 0) x /= 5, ++p5;
while(y % 2 == 0) y /= 2, --p2;
while(y % 3 == 0) y /= 3, --p3;
while(y % 5 == 0) y /= 5, --p5;
if(p5 > 0) {
dr5 += p5;
if(p3 > 0) {
dr3 += p3;
for(int i = dr5; i - p5 >= st5; --i)
for(int j = dr3; j - p3 >= st3; --j)
dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
} else {
st3 += p3;
for(int i = dr5; i - p5 >= st5; --i)
for(int j = st3; j - p3 <= dr3; ++j)
dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
}
} else {
st5 += p5;
if(p3 > 0) {
dr3 += p3;
for(int i = st5; i - p5 <= dr5; ++i)
for(int j = dr3; j - p3 >= st3; --j)
dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
} else {
st3 += p3;
for(int i = st5; i - p5 <= dr5; ++i)
for(int j = st3; j - p3 <= dr3; ++j)
dp[i][j] = max(dp[i][j], dp[i - p5][j - p3] + p2);
}
}
}
double ans = -1;
int ans2 = 0, ans3 = 0, ans5 = 0;
for(int i = 0; i <= N5MAX; ++i)
for(int j = 0; j <= N3MAX; ++j) {
const int p2 = dp[i + N5MAX][j + N3MAX];
if(p2 >= 0) {
const double crt = log(2.0) * p2 + log(3.0) * j + log(5.0) * i;
if(crt > ans)
ans = crt,
ans2 = p2, ans3 = j, ans5 = i;
}
}
a[0] = a[1] = 1;
for(int i = 1; i <= ans2; ++i) nrm_mults(2);
for(int i = 1; i <= ans3; ++i) nrm_mults(3);
for(int i = 1; i <= ans5; ++i) nrm_mults(5);
for(int i = a[0]; i >= 1; --i) printf("%d", a[i]);
return 0;
}