Cod sursa(job #1369873)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 3 martie 2015 11:54:22
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define N 51
using namespace std;
int n,lf=0,na,ni,st[N];
long long P=1,maxp=0;
struct fractie
{
    short na[10],ni[10];
}fr[N];
void factoriprimi(int na,int ni,int i)
{
    while(na%5==0) {fr[lf].na[5]++;na/=5;}
    while(na%3==0) {fr[lf].na[3]++;na/=3;}
    while(na%2==0) {fr[lf].na[2]++;na/=2;}
    while(ni%5==0)
    {
        if(fr[lf].na[5]>0)fr[lf].na[5]--;
        else fr[lf].ni[5]++;
        ni/=5;
    }
    while(ni%3==0)
    {
        if(fr[lf].na[3]>0)fr[lf].na[3]--;
        else fr[lf].ni[3]++;
        ni/=3;
    }
    while(ni%2==0)
    {
        if(fr[lf].na[2]>0)fr[lf].na[2]--;
        else fr[lf].ni[2]++;
        ni/=2;
    }
}
void valid()
{
    int i,na[10]={0},ni[10]={0};
    long long p;
    for(i=0;i<lf;i++)
        if(st[i])
        {
            na[2]+=fr[i].na[2];
            na[3]+=fr[i].na[3];
            na[5]+=fr[i].na[5];
            ni[2]+=fr[i].ni[2];
            ni[3]+=fr[i].ni[3];
            ni[5]+=fr[i].ni[5];
        }
    while(na[2]>0 && ni[2]>0) na[2]--,ni[2]--;
    while(na[3]>0 && ni[3]>0) na[3]--,ni[3]--;
    while(na[5]>0 && ni[5]>0) na[5]--,ni[5]--;
    if(ni[2]==0 && ni[3]==0 && ni[5]==0)
    {
        p=pow(2,na[2])*pow(3,na[3])*pow(5,na[5]);
        if(p*P>maxp) maxp=p*P;
        //return 1;
    }
    //return 0;
}
void back(int k)
{
    int i;
    for(i=0;i<=1;i++)
    {
        st[k]=i;
        valid();
        if(k<lf-1)back(k+1);
    }
}
int main()
{
    int i;
    ifstream f("aliens.in");
    ofstream g("aliens.out");
    f>>n;
    for(i=0;i<n;i++)
    {
        f>>na>>ni;
        fr[lf].na[2]=fr[lf].na[3]=fr[lf].na[5]=0;
        factoriprimi(na,ni,i);
        if(fr[lf].ni[2]==0 && fr[lf].ni[3]==0 && fr[lf].ni[5]==0)
            P*=(pow(2,fr[lf].na[2])*pow(3,fr[lf].na[3])*pow(5,fr[lf].na[5]));
        else lf++;
    }
    back(0);
    g<<maxp;
}