Cod sursa(job #485805)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 septembrie 2010 16:17:03
Problema Aliens Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 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 127

char din[2][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];
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>1; ){
			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>1; ){
			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];
	}
	//for(i=1;i<=N;++i) p3[i]+=min3[N], p5[i]+=min5[N];
}	

void solve(){
	int i,j,k,st;
	for(j=0; j<=max3[N]+min3[N]; ++j)
		for(k=0; k<=max5[N]+min5[N]; ++k)
			din[0][j][k]=-INF;
	din[0][p3[1]+min3[N]][p5[1]+min5[N]]=p2[1];
	din[0][min3[N]][min5[N]]=0;
	
	st=0;
	for(i=2;i<=N;++i){
		for(j=0; j<=max3[N]+min3[N]; ++j)
			for(k=0; k<=max5[N]+min5[N]; ++k)
				din[st^1][j][k]=-INF;

		for(j=0; j<=max3[i]+min3[N]; ++j)
			for(k=0; k<=max5[i]+min5[N]; ++k){
				din[st^1][j][k]=din[st][j][k];
				if( j-p3[i]>=0 && k-p5[i]>=0 && j-p3[i]<=max3[N]+min3[N] && k-p5[i]<=max5[N]+min5[N] )
					if( din[st][j-p3[i]][k-p5[i]]!= -INF)
						din[st^1][j][k]=Maxim(din[st^1][j][k],din[st][j-p3[i]][k-p5[i]]+p2[i]);
			}
		st ^=1;
	}
	
	for(j=min3[N];j<=max3[N]+min3[N];++j)
		for(k=min5[N];k<=max5[N]+min5[N];++k)
			if( din[st][j][k] >=0 )
				if( din[st][j][k]*log(2)+j*log(3)+k*log(5) > vmax ){
					vmax=din[st][j][k]*log(2)+j*log(3)+k*log(5);
					pf2=din[st][j][k]; pf3=j-min3[N]; pf5=k-min5[N];
				}
}

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;
}