Cod sursa(job #2008964)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 8 august 2017 10:31:54
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 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;
}