Pagini recente » Cod sursa (job #1721334) | Rezultatele filtrării | Borderou de evaluare (job #928997) | Rezultatele filtrării | Cod sursa (job #2610400)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aliens.in");
ofstream fout("aliens.out");
const int l3 = 18 * 50, l5 = 12 * 50;
short int dp[l5 + l5 + 5 + 30][l3 + l3 + 5 + 30], inf = -30000, p, q, u, v, ans2, ans3, ans5, vv[6000];
double best = -1;
inline void inmult(short int a[], int x) {
int tr = 0, i = 1;
while (i <= a[0] || tr) {
tr += a[i] * x;
a[i] = tr % 10;
tr /= 10;
i++;
}
i--;
if (i > a[0])
a[0] = i;
}
inline short int mymax(short int a, short int b) {
if (a > b) return a;
else return b;
}
int main()
{
for (int i = 0; i <= l5 + l5 + 30; ++i)
{
for (int j = 0; j <= l3 + l3 + 30; ++j)
{
dp[i][j] = inf;
}
}
dp[l5][l3] = 0;
p = q = l5;
v = u = l3;
int n;
fin >> n;
for (int i = 1; i <= n; ++i)
{
int x, y;
short int p2 = 0, p3 = 0, p5 = 0;
fin >> x >> y;
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) {
q += p5;
if (p3 > 0) {
v += p3;
for (int i = q; i - p5 >= p; i--)
for (int j = v; j - p3 >= u; j--)
dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
} else {
u += p3;
for (int i = q; i - p5 >= p; i--)
for (int j = u; j - p3 <= v; j++)
dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
}
} else {
p += p5;
if (p3 > 0) {
v += p3;
for (int i = p; i - p5 <= q; i++)
for (int j = v; j - p3 >= u; j--)
dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
} else {
u += p3;
for (int i = p; i - p5 <= q; i++)
for (int j = u; j - p3 <= v; j++)
dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
}
}
}
for (int i = 0; i <= l5; ++i)
{
for (int j = 0; j <= l3; ++j)
{
short int p2 = dp[i + l5][j + l3];
if (p2 >= 0)
{
double val = log(2.0) * p2 + log(3.0) * j + log(5.0) * i;
if (val > best)
{
best = val;
ans2 = p2;
ans3 = j;
ans5 = i;
}
}
}
}
vv[0] = 1;
vv[1] = 1;
for (int i = 1; i <= ans2; ++i) inmult(vv, 2);
for (int i = 1; i <= ans3; ++i) inmult(vv, 3);
for (int i = 1; i <= ans5; ++i) inmult(vv, 5);
for (int i = vv[0]; i >= 1; --i) fout << vv[i];
fin.close();
fout.close();
return 0;
}