Pagini recente » Cod sursa (job #1758964) | Cod sursa (job #2105263) | Cod sursa (job #1981885) | Cod sursa (job #372969) | Cod sursa (job #485798)
Cod sursa(job #485798)
#include <stdio.h>
#include <math.h>
#define Nmax 52
#define Treimax 900+100
#define Cincimax 600+100
#define B 10000
#define Cmax 800
#define INF 10000
int 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;
}