Cod sursa(job #312606)

Utilizator FlorianFlorian Marcu Florian Data 6 mai 2009 16:52:39
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<cstdio>
#include<math.h>
#include<algorithm>
#define Inf 2000
#define MAX_N 1010
using namespace std;
int bst[MAX_N][MAX_N];
int N, nr[3];
const int M = 500;
int s,s3,s5;
inline int desc(int a, int b) // a / b
{
	int r;
	for(r=0;a%b==0;a/=b,++r);
	return r;
}
int MAX3, MIN3, MAX5, MIN5;
int rez[512];
inline void mul(int A[], int B) // A[] = A[] * B;
{
	int t = 0,i;
	for(i = 1; i<=A[0] || t; t/=10, ++i)
		A[i] = (t += A[i] * B ) % 10;
    A[0] = i-1;
}		
int main()
{
	freopen("aliens.in","r",stdin);
	freopen("aliens.out","w",stdout);
	scanf("%d",&N);
	int i,x,y,j,k;
	int beg1, end1, step1;
	int beg2, end2, step2;
	for(j=0;j<MAX_N;++j)
		for(k=0;k<MAX_N;++k)
			bst[j][k] = -Inf;
	bst[M][M] = 0;
	for(i=1;i<=N;++i)
	{
		scanf("%d%d",&x,&y);
		nr[0] = desc(x,2) - desc(y,2);
		nr[1] = desc(x,3) - desc(y,3);
		nr[2] = desc(x,5) - desc(y,5);
		
		if( nr[1] >= 0) { beg1 = MAX3; end1 = MIN3; step1 = -1; }
		else { beg1 = MIN3; end1 = MAX3; step1 = 1;}
		if(nr[2] >= 0) { beg2 = MAX5; end2 = MIN5; step2 = -1; }
		else { beg2 = MIN5; end2 = MAX5; step2 = 1; }
		
		for(x = beg1; x != end1 + step1; x += step1)
			for(y = beg2; y != end2 + step2; y += step2)
				{
					if( bst[M+ x][M +y] == -Inf) continue;
					if(bst[M+ x + nr[1]][M+ y + nr[2]] <  bst[M+ x][M+ y] + nr[0])
					{
						bst[M+ x + nr[1]][M+ y + nr[2]] = bst[M + x][M+ y] + nr[0];
						if(x + nr[1] < MIN3) MIN3 = x+nr[1];
						if(x + nr[1] > MAX3) MAX3 = x+nr[1];
						if(y + nr[2] < MIN5) MIN5 = y+nr[2];
						if(y + nr[2] > MAX5) MAX5 = y+nr[2];
					}
			}
						
	}
	double l2 = log(2), l3 = log(3), l5=log(5);
	int ii,jj;
	double sol = 0.0, tmp;
	for(x = 0; x<=MAX3; ++x)
		for(y = 0; y<=MAX5; ++y)
		{
			if( bst[M+ x][M+ y] < 0) continue;
			tmp = bst[M+ x][M+ y] * l2 + x * l3 + y * l5;
			if( tmp > sol) 
			{
				sol = tmp;
				ii = x; jj = y;
			}
		}
	rez[ rez[0] = 1 ] = 1;
	for(i=1;i<=bst[ii+M][jj+M]; ++i) mul(rez,2);
	for(i=1;i<=ii;++i) mul(rez,3);
	for(i=1;i<=jj;++i) mul(rez,5);
	// hai cu punctele!
	for(i=rez[0];i>0;--i) printf("%d",rez[i]);
	printf("\n");
	return 0;
}