Cod sursa(job #485816)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 septembrie 2010 16:45:23
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <stdio.h>
#include <math.h>
#define Nmax 52
#define Treimax 900*2+1
#define Cincimax 600*2+1
#define B 10000
#define Cmax 800
#define INF 1500

int din[Treimax][Cincimax];
int p2[Nmax],p3[Nmax],p5[Nmax];
int max3[Nmax],min3[Nmax],max5[Nmax],min5[Nmax];
int N,pf2,pf3,pf5,prod[Cmax],C3,C5;
double vmax;


inline int Maxim(int x,int y){ return x>y ? x:y; }

void read(){
	int i,x,y;
	freopen("aliens.in","r",stdin);
	freopen("aliens.out","w",stdout);
	scanf("%d",&N);
	for(i=1;i<=N;++i){
		scanf("%d%d",&x,&y);
		for( ; x%2 == 0; x/=2 ) ++p2[i];
		for( ; x%3 == 0; x/=3 ) ++p3[i];	
		for( ; x%5 == 0; x/=5 ) ++p5[i];			
		for( ; y%2 == 0; y/=2 ) --p2[i];
		for( ; y%3 == 0; y/=3 ) --p3[i];	
		for( ; y%5 == 0; y/=5 ) --p5[i];			
	}
	for(i=1;i<=N;++i){
		min3[i]=min3[i-1]; min5[i]=min5[i-1];
		max3[i]=max3[i-1]; max5[i]=max5[i-1];
		
		if( p3[i]<0 ) min3[i]+=p3[i]; 
		else max3[i]+=p3[i];
		
		if( p5[i]<0 ) min5[i]+=p5[i]; 
		else max5[i]+=p5[i];
	}
}	

void solve(){
	int i,j,k,pas,b3,e3,b5,e5,pas3,pas5;
	C3=-min3[N]; C5=-min5[N];
	for(j=0; j<=max3[N]+C3; ++j)
		for(k=0; k<=max5[N]+C5; ++k)
			din[j][k]=-INF;
	din[C3][C5]=0; din[p3[1]+C3][p5[1]+C5]=p2[1];
	
	for(i=2;i<=N;++i){
		if( p3[i]>=0 ) b3=max3[i], e3=min3[i], pas3=-1;
		else b3=min3[i], e3=max3[i], pas3=1;
		if( p5[i]>=0 ) b5=max5[i], e5=min5[i], pas5=-1;
		else b5=min5[i], e5=max5[i], pas5=1;

		for(j=b3; j!=e3+pas3; j+=pas3)
			for(k=b5; k!=e5+pas5; k+=pas5)
				if( din[j+C3][k+C5] != -INF ){
					if( j+p3[i]+C3>=0 && k+p5[i]+C5>=0 && j+p3[i]<=max3[N] && k+p5[i]<=max5[N] )
						din[j+p3[i]+C3][k+p5[i]+C5]=Maxim(din[j+p3[i]+C3][k+p5[i]+C5],din[j+C3][k+C5]+p2[i]);
			}
	}
	
	for(j=C3;j<=max3[N]+C3;++j)
		for(k=C5;k<=max5[N]+C5;++k)
			if( din[j][k] >=0 )
				if( din[j][k]*log(2)+j*log(3)+k*log(5) > vmax ){
					vmax=din[j][k]*log(2)+j*log(3)+k*log(5);
					pf2=din[j][k]; pf3=j-C3; pf5=k-C5;
				}
}

inline void mul(int a[],int b){
	int i,t;
	for(i=1,t=0; i<=a[0] || t; ++i,t/=B)
		a[i]=(t+=a[i]*b)%B;
	a[0]=i-1;
}	

void write(){
	int i;
	prod[0]=prod[1]=1;
	for(i=1;i<=pf2;++i) mul(prod,2);
	for(i=1;i<=pf3;++i) mul(prod,3);
	for(i=1;i<=pf5;++i) mul(prod,5);
	
	printf("%d",prod[prod[0]]);
	for(i=prod[0]-1;i>=1;--i) printf("%04d",prod[i]);
	printf("\n");
	fclose(stdin); fclose(stdout);
}

int main(){
	read();
	solve();
	write();
	
	return 0;
}