Cod sursa(job #918759)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 19 martie 2013 09:28:14
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
#include<math.h>
#define X3 950
#define X5 650
#define l2 log(2)
#define l3 log(3)
#define l5 log(5)
long n,i,j,a,b,aa,bb,p2,p3,p5,st,dr,se,sst,ddr,sse,mx3,mx5,mi3,mi5,a1,a2,a3,rex[10000];
char x[2*X3+1][2*X5+1];
double y,max;
void inm(long rex[],long x)
{long i,t=0;
for(i=1;i<=rex[0];++i)
{
rex[i]=rex[i]*x+t;
t=rex[i]/10;
rex[i]%=10;
}
while(t){rex[++rex[0]]=t%10;t/=10;}
}
int main()
{
freopen("aliens.in","r",stdin);
freopen("aliens.out","w",stdout);
scanf("%ld",&n);
for(i=0;i<=2*X3;++i)
for(j=0;j<=2*X5;++j)
x[i][j]=-127;
x[X3][X5]=0;
for(i=1;i<=n;++i)
{scanf("%ld%ld",&a,&b);
p2=0;
p3=0;
p5=0;
while(a%2==0)a/=2,p2++;
while(a%3==0)a/=3,p3++;
while(a%5==0)a/=5,p5++;
while(b%2==0)b/=2,p2--;
while(b%3==0)b/=3,p3--;
while(b%5==0)b/=5,p5--;
if(p3<0)st=mi3+X3,dr=mx3+X3,se=1;
else st=mx3+X3,dr=mi3+X3,se=-1;
if(p5<0)sst=mi5+X5,ddr=mx5+X5,sse=1;
else sst=mx5+X5,ddr=mi5+X5,sse=-1;
if(mi3>mi3+p3)mi3+=p3;
if(mx3<mx3+p3)mx3+=p3;
if(mi5>mi5+p5)mi5+=p5;
if(mx5<mx5+p5)mx5+=p5;
for(aa=st+p3,a=st;a!=se+dr;aa+=se,a+=se)
for(bb=sst+p5,b=sst;b!=sse+ddr;bb+=sse,b+=sse)
{if(x[a][b]==-127)continue;
if(x[a][b]+p2>x[aa][bb])
x[aa][bb]=x[a][b]+p2;}}
max=-1;
for(i=mx3+X3;i>=X3;--i)
for(j=mx5+n+X5;j>=X5;--j)
{if(x[i][j]<0)continue;
y=x[i][j]*l2+(i-X3)*l3+(j-X5)*l5;
if(max<y){max=y;a1=x[i][j];a2=i-X3;a3=j-X5;}}
rex[1]=rex[0]=1;
for(i=1;i<=a3;++i)inm(rex,5);
for(i=1;i<=a2;++i)inm(rex,3);
for(i=1;i<=a1;++i)inm(rex,2);
for(;rex[0];rex[0]--)
printf("%ld",rex[rex[0]]);
printf("\n");
return 0;
}