Pagini recente » Cod sursa (job #2175849) | Cod sursa (job #732418) | Cod sursa (job #1879784) | Rating Andrei Petruta (Andrei_Petruta96) | Cod sursa (job #2058813)
#include<bits/stdc++.h>
#define inf 30000
using namespace std;
typedef struct tip
{
int x2,x3,x5;
tip operator-(const tip& a)
{
return {x2-a.x2,x3-a.x3,x5-a.x5};
}
};
short dp[2][850][850];
inline tip f(int x)
{
int x2=0,x3=0,x5=0;
while(!(x%2))
{
x/=2;
x2++;
}
while(!(x%3))
{
x/=3;
x3++;
}
while(!(x%5))
{
x/=5;
x5++;
}
return {x2,x3,x5};
}
tip val;
int n,x,y;
inline void Copiere(int a[],int b[])
{
// memcpy(a,b,sizeof(b));
for(int i=0;i<=1000;i++) a[i]=b[i];
}
inline void Inmultire(int a[],int b[])
{
int t=0,i,j;
int c[1005];
memset(c,0,sizeof(c));
for(i=1;i<=a[0];i++)
{
for(j=1;j<=b[0] || t;j++)
{
c[i+j-1]+=(t+a[i]*b[j]);
t=c[i+j-1];
c[i+j-1]%=10;
t/=10;
}
if((i+j-2)>c[0]) c[0]=i+j-2;
}
Copiere(a,c);
}
int aux[1005],p[1005];
int main()
{
freopen("aliens.in","r",stdin);
freopen("aliens.out","w",stdout);
scanf("%d",&n);
for(int j=0;j<=840;j++)
for(int k=0;k<=840;k++) dp[0&1][j][k]=-inf;
dp[0][420][420]=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
tip e=f(x)-f(y);
for(int j=0;j<=840;j++)
for(int k=0;k<=840;k++)
dp[i&1][j][k]=-inf;
dp[i&1][420][420]=0;
for(int j=0;j<=840;j++)
for(int k=0;k<=840;k++)
{
if(dp[(i-1)&1][j][k]==-inf) continue;
dp[i&1][j][k]=max(dp[i&1][j][k],dp[(i-1)&1][j][k]);
dp[i&1][j+e.x3][k+e.x5]=max(dp[i&1][j+e.x3][k+e.x5],(short)(dp[(i-1)&1][j][k]+e.x2));
}
}
for(int j=420;j<=840;j++)
for(int k=420;k<=840;k++)
{
if(dp[n&1][j][k]<0) continue;
double x1=dp[n&1][j][k]*log((double)2)+(j-420)*log((double)3)+(k-420)*log((double)5);
double x2=val.x2*log((double)2)+val.x3*log((double)3)+val.x5*log((double)5);
if(x1>x2 && dp[n&1][j][k]>=0)
{
val.x2=(int)dp[n&1][j][k];
val.x3=j-420;
val.x5=k-420;
}
}
// printf("%d %d %d\n",val.x2,val.x3,val.x5);
aux[0]=1;
aux[1]=1;
p[0]=1;
p[1]=2;
for(int i=1;i<=val.x2;i++)
Inmultire(aux,p);
p[1]=3;
for(int i=1;i<=val.x3;i++)
Inmultire(aux,p);
p[1]=5;
for(int i=1;i<=val.x5;i++)
Inmultire(aux,p);
for(int i=aux[0];i>=1;i--)
printf("%d",aux[i]);
printf("\n");
return 0;
}