Cod sursa(job #995475)

Utilizator teoionescuIonescu Teodor teoionescu Data 8 septembrie 2013 23:41:48
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<fstream>
using namespace std;
ifstream in("aliens.in");
ofstream out("aliens.out");
const int N = 55;
struct ffrac{
	struct numarator{
		int d,t,c;
	} n;
	struct numitor{
		int d,t,c;
	} nn;
} v[N],proc[N],total[N];
int n,x,y,select[N],m,bb[N],maxx;
ffrac sum(ffrac a,ffrac b){
	ffrac s;
	s.n.d=a.n.d+b.n.d;
	s.n.t=a.n.t+b.n.t;
	s.n.c=a.n.c+b.n.c;
	s.nn.d=a.nn.d+b.nn.d;
	s.nn.t=a.nn.t+b.nn.t;
	s.nn.c=a.nn.c+b.nn.c;
	return s;
}
int categor(ffrac a){
	int doi=a.n.d-a.nn.d;
	int trei=a.n.t-a.nn.t;
	int cinci=a.n.c-a.nn.c;
	if(doi>=0 && trei>=0 && cinci>=0) return 1;
	if(doi<=0 && trei<=0 && cinci<=0) return 2;
	return 0;
}
int power(int b,int e){
	int p=1;
	for(int i=1;i<=e;i++) p*=b;
	return p;
}
void process2(ffrac a){
	//out<<a.n.d<<' '<<a.n.t<<' '<<a.n.c<<'\n';
	int comp=1;
	comp*=power(2,a.n.d);
	comp*=power(3,a.n.t);
	comp*=power(5,a.n.c);
	if(comp>maxx) maxx=comp;
}
void process1(ffrac a){
	//out<<a.n.d<<' '<<a.n.t<<' '<<a.n.c<<' '<<a.nn.d<<' '<<a.nn.t<<' '<<a.nn.c<<'\n';
	int doi=a.n.d-a.nn.d;
	int trei=a.n.t-a.nn.t;
	int cinci=a.n.c-a.nn.c;
	if(doi>=0 && trei>=0 && cinci>=0){
		ffrac b;
		b.n.d=doi;
		b.n.t=trei;
		b.n.c=cinci;
		process2(b);
	}
}
void back(int i){
	for(bb[i]=bb[i-1]+1;bb[i]<=m;bb[i]++){
		total[i]=sum(total[i-1],proc[bb[i]]);
		process1(total[i]);
		if(i<m) back(i+1);
	}
}
int main(){
	in>>n;
	for(int i=1;i<=n;i++){
		in>>x>>y;
		while(x%2==0){v[i].n.d++;x/=2;}
		while(x%3==0){v[i].n.t++;x/=3;}
		while(x%5==0){v[i].n.c++;x/=5;}
		while(y%2==0){v[i].nn.d++;y/=2;}
		while(y%3==0){v[i].nn.t++;y/=3;}
		while(y%5==0){v[i].nn.c++;y/=5;}
	}
	for(int i=1;i<=n;i++) select[i]=categor(v[i]);
	for(int i=1;i<=n;i++){
		if(select[i]==0) proc[++m]=v[i];
		if(select[i]==1) total[0]=sum(total[0],v[i]);
	}
	back(1);
	out<<maxx;
	return 0;
}