Cod sursa(job #106218)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 18 noiembrie 2007 14:21:06
Problema Aliens Scor Ascuns
Compilator cpp Status done
Runda Marime 1.89 kb
#include <stdio.h>
#include <math.h>
#include <assert.h>

#define nmax1 1805
#define lmax1 900
#define nmax2 1205
#define lmax2 600
#define cmax 1024
#define nmax 50
#define inf 1000111000
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define FORD(i,s,d) for(i=(d)-1;i>=(s);--i)

int n,A[nmax1][nmax2],rez[cmax];

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

int main()
{
	int i,a,b,c,ii,j,l1,l2,r1,r2,x;
	assert(freopen("aliens.in","r",stdin));
	freopen("aliens.out","w",stdout);
	assert(scanf("%d",&n)==1);
	assert(n<=50);
	assert(n>=1);
	FOR(i,0,nmax1) FOR(j,0,nmax2)
		A[i][j]=-inf;
	A[lmax1][lmax2]=0;
	l1=lmax1, r1=l1+1;
	l2=lmax2, r2=l2+1;
	FOR(ii,0,n)
	{
		assert(scanf("%d",&x)==1);
		assert(x<=400000000);
		assert(x>0);
		for(a=0;x%2==0;x/=2,a++);
		for(b=0;x%3==0;x/=3,b++);
		for(c=0;x%5==0;x/=5,c++);
		assert(x==1);
		assert(scanf("%d",&x)==1);
		assert(x<=400000000);
		assert(x>0);
		for(;x%2==0;x/=2,a--);
		for(;x%3==0;x/=3,b--);
		for(;x%5==0;x/=5,c--);
		assert(x==1);
		if(b<=0&&c<=0)
			FOR(i,l1,r1) FOR(j,l2,r2)
				if(A[i][j]+a>A[i+b][j+c])
					A[i+b][j+c]=A[i][j]+a;
		if(b>0&&c<=0)
			FORD(i,l1,r1) FOR(j,l2,r2)
				if(A[i][j]+a>A[i+b][j+c])
					A[i+b][j+c]=A[i][j]+a;
		if(b<=0&&c>0)
			FOR(i,l1,r1) FORD(j,l2,r2)
				if(A[i][j]+a>A[i+b][j+c])
					A[i+b][j+c]=A[i][j]+a;
		if(b>0&&c>0)
			FORD(i,l1,r1) FORD(j,l2,r2)
				if(A[i][j]+a>A[i+b][j+c])
					A[i+b][j+c]=A[i][j]+a;
		if(b>=0)
			r1+=b;
		else
			l1+=b;
		if(c>=0)
			r2+=c;
		else
			l2+=c;
	}
	double sol=-1,lg2=log(2),lg3=log(3),lg5=log(5);
	a=b=c=0;
	FOR(i,lmax1,nmax1) FOR(j,lmax2,nmax2)
		if(A[i][j]>0&&(i-lmax1)*lg3+(j-lmax2)*lg5+A[i][j]*lg2>sol)
			sol=(i-lmax1)*lg3+(j-lmax2)*lg5+A[i][j]*lg2,b=i-lmax1,c=j-lmax2,a=A[i][j];
	rez[0]=rez[1]=1;
	FOR(i,0,a) inm(2);
	FOR(i,0,b) inm(3);
	FOR(i,0,c) inm(5);
	FORD(i,1,rez[0]+1)
		printf("%d",rez[i]);
	printf("\n");
	return 0;
}