Cod sursa(job #201540)

Utilizator devilkindSavin Tiberiu devilkind Data 1 august 2008 13:22:24
Problema Aliens Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <algorithm>
#include <utility>

using namespace std;

#define NMAX 52
#define L2 66
#define L3 42
#define L5 32

int cd[L2*L3*L5][3];
int h[L2][L2][L2];
int a[NMAX][3];
int n,k,nk;
int pr[6];
long long p2[L2],p3[L3],p5[L5];
long long sol;

inline int sh(int x)
{
	return x+32;
}

int main()
{
	freopen("aliens.in","r",stdin);
	freopen("aliens.out","w",stdout);

	int i,j,x,y,z;

	scanf("%d",&n);


	fprintf(stderr,"x");

	for (i=1;i<=n;i++)
		{
			scanf("%d %d",&x,&y);

			memset(pr,0,sizeof(pr));
	
			for (j=2;j*j<=x;j++)
				for (;x%j==0;x/=j) pr[j]++;
			if (x>1) pr[x]++;

			for (j=2;j*j<=y;j++)
				for (;y%j==0;y/=j) pr[j]--;
			 if (y>1) pr[y]--;


			 a[i][0]=pr[2];
			 a[i][1]=pr[3];
			 a[i][2]=pr[5];
		}

	p2[0]=p3[0]=p5[0]=1;
	
	for ( i=1;p2[i-1]*2< (long long)1<<31;i++ ) p2[i]=p2[i-1]*2;
	for ( i=1;p3[i-1]*3< (long long)1<<31;i++ ) p3[i]=p3[i-1]*3;
	for ( i=1;p5[i-1]*5< (long long)1<<31;i++ ) p5[i]=p5[i-1]*5;

	nk=k=0;
	sol=0;


	for (i=1;i<=n;i++)
	{
		k=nk;
		for (j=0;j<=k;j++)
		{
			x=cd[j][0]+a[i][0];
			y=cd[j][1]+a[i][1];
			z=cd[j][2]+a[i][2];


			if (h[ sh(x) ][ sh(y) ][ sh(z) ]) continue;
			
			h[ sh(x) ][ sh(y) ][ sh(z) ]=1;
			nk++;
			cd[nk][0]=x;cd[nk][1]=y;cd[nk][2]=z;

			if ( (x>=0)&&(y>=0)&&(z>=0) ) 
			{
				sol=max(sol, (long long) p2[x]*p3[y]*p5[z] );
			}
		}
	}

	printf("%lld",sol);
	return 0;
}