Pagini recente » Cod sursa (job #2188096) | Cod sursa (job #702654) | Cod sursa (job #3189325) | Cod sursa (job #445893) | Cod sursa (job #2736908)
#include <bits/stdc++.h>
#define inf 30000
using namespace std;
ifstream fin("aliens.in");
ofstream fout("aliens.out");
const int nr3 = 18 * 18, nr5 = 12 * 12;
short int dp[2 * nr5 + 40][2 * nr3 + 40], afis[10000], st5, dr5, st3, dr3;
void inmult(int val){
int t = 0;
for(int i = 1; i <= afis[0]; ++i){
afis[i] = afis[i] * val + t;
t = afis[i] / 10;
afis[i] %= 10;
}
while(t)
afis[++afis[0]] = t % 10, t /= 10;
}
int main()
{
for(int i = 0; i <= 2 * nr5 + 30; ++i)
for(int j = 0; j <= 2 * nr3 + 30; ++j)
dp[i][j] = -inf;
dp[nr5][nr3] = 0;
st5 = dr5 = nr5;
st3 = dr3 = nr3;
int n;
fin >> n;
for(int i = 1; i <= n; ++i)
{
int x, y;
fin >> x >> y;
int p2 = 0, p3 = 0, p5 = 0;
while(x % 2 == 0)
++p2, x /= 2;
while(x % 3 == 0)
++p3, x /= 3;
while(x % 5 == 0)
++p5, x /= 5;
while(y % 2 == 0)
--p2, y /= 2;
while(y % 3 == 0)
--p3, y /= 3;
while(y % 5 == 0)
--p5, y /= 5;
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(short(dp[i][j]), short(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(short(dp[i][j]), short(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(short(dp[i][j]), short(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(short(dp[i][j]), short(dp[i - p5][j - p3] + p2));
}
}
}
double rez = -1;
int ans2 = 0, ans3 = 0, ans5 = 0;
for(int i = 0; i <= nr5; ++i)
for(int j = 0; j <= nr3; ++j)
{
int p2 = dp[i + nr5][j + nr3];
if(p2 >= 0){
double val = log(2.0) * p2 + log(3.0) * j + log(5.0) * i;
if(val > rez){
rez = val;
ans2 = p2;
ans3 = j;
ans5 = i;
}
}
}
afis[0] = afis[1] = 1;
for(int i = 1; i <= ans2; ++i)
inmult(2);
for(int i = 1; i <= ans3; ++i)
inmult(3);
for(int i = 1; i <= ans5; ++i)
inmult(5);
for(int i = afis[0]; i >= 1; --i)
fout << afis[i];
return 0;
}