Cod sursa(job #372884)

Utilizator Andrei200Andrei200 Andrei200 Data 11 decembrie 2009 22:23:37
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <cstdio>
#include <cstring>
#include <cmath>

#define file_in "aliens.in"
#define file_out "aliens.out"

#define Baza 10000
#define Inf 0x3f3f3f3f
#define Nmax 1010
#define l2 log(2)
#define l3 log(3)
#define l5 log(5)

int n,nr2,nr3,nr5;
int d[Nmax][Nmax];
int sol[Nmax];
int a,b,dd;

int nr(int x, int k)
{
	int nrr=0;
	while(x%k==0)
	{
		nrr++;
		x/=k;
	}
	
	return nrr;
}

void inm(int a[], int cif)
{
	int i,t=0;
	
	for (i=1;i<=a[0]||t;++i,t/=Baza)
		 a[i]=(t=a[i]*cif)%Baza;
	a[0]=i-1;
}

void write(int a[])
{
	int i;
	printf("%d", a[a[0]]);
	for (i=a[0]-1;i>=1;--i)
		 printf("%.04d",a[i]);
}

inline int max(int a, int b) { return a>b?a:b; }
inline int min(int a, int b) { return a<b?a:b; }
inline int abs(int a) { return a>=0?a:-a; }


int main()
{
	int i,j,k,indi,indj;
	double Max;
	int start3,start5,m3,m5,stop3,stop5;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	for (i=0;i<=Nmax;++i)
		 for (j=0;j<=Nmax;++j)
			  d[i][j]=-Inf;
	d[Nmax/2][Nmax/2]=0;	 
	
    scanf("%d", &n);
	for (i=1;i<=n;++i)
	{
		scanf("%d %d", &a, &b);
		nr2=nr(a,2)-nr(b,2);
		nr3=nr(a,3)-nr(b,3);
		nr5=nr(a,5)-nr(b,5);
		
				
		dd=max(abs(nr3),abs(nr5));
		
		if (nr3>=0)
		{
			start3=dd;
			stop3=-dd+Nmax/2;
			m3=-1;
		}
		else
		{
			start3=-dd;
			stop3=dd+Nmax/2;
			m3=1;
		}
		if (nr5>=0)
		{
			start5=dd;
			stop5=-dd+Nmax/2;
			m5=-1;
		}
		else
		{
			start5=-dd;
			stop5=dd+Nmax/2;
			m5=1;
		}
		
		for (j=start3;j<=stop3;j+=m3)
			 for (k=start5;k<=stop5;k+=m5)
				  if (d[j][k]!=-Inf) 
				      d[j+nr3][k+nr5]=max(d[j+nr3][k+nr5],d[j][k]+nr2);
				  
	}
	
	Max=0;
	indi=indj=0;
	for (i=0;i<Nmax;++i)
         for (j=0;j<Nmax;++j)
		 {
			 if (d[i][j]==-Inf) 
				  continue;
			 if (i-Nmax/2<0 || j-Nmax/2<0) continue; 
              if (d[i][j]<0) continue; 
              if (d[i][j]*l2+(i-Nmax/2)*l3+(j-Nmax/2)*l5>Max)
              {
				  indi=i;
				  indj=j;
				  Max=d[i][j]*l2+(i-Nmax/2)*l3+(j-Nmax/2)*l5;
			  }
		 }
	
    sol[0]=sol[1]=1;		
    //printf("%d\n", d[indi][indj]);	
	for (i=1;i<=d[indi][indj];++i)
         inm(sol,2);
	for (i=1;i<=indi-Nmax/2;++i)
		 inm(sol,3);
	for (i=1;i<=indj-Nmax/2;++i)
		 inm(sol,5);
	
	write(sol);
	
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}