Cod sursa(job #109435)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 25 noiembrie 2007 11:05:42
Problema Aliens Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 1.4 kb
#include<stdio.h>
#include<math.h>

struct str{
    int a;
    int b;
    int c;
}u[51][2];


short int i;
int max=-1;

void backtr(short int k, short int n, str p)
{
    int i;
    
    double s=(double)pow(2.0,p.a) * (double)pow(3.0,p.b) * (double)pow(5.0,p.c);
    if(s==(int)s)
    {
        if(max<(int)s) max=(int)s;
    }
    if(k<=n){
        for(i=k;i<=n;i++)
        {
            p.a+=u[i][0].a;
            p.b+=u[i][0].b;
            p.c+=u[i][0].c;
            backtr(i+1,n,p);
            p.a-=u[i][0].a;
            p.b-=u[i][0].b;
            p.c-=u[i][0].c;
        }
    }
}
int main()
{
    short int n;
    int x,y;
    FILE *fin,*fout;
    fin=freopen("aliens.in","r",stdin);
    fout=freopen("aliens.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {    
         scanf("%d",&x); scanf("%d",&y);
         while(x%2==0) {x/=2; u[i][0].a++;}
         while(x%3==0) {x/=3; u[i][0].b++;}
         while(x%5==0) {x/=5; u[i][0].c++;}
         
         while(y%2==0) {y/=2; u[i][1].a++;}
         while(y%3==0) {y/=3; u[i][1].b++;}
         while(y%5==0) {y/=5; u[i][1].c++;}
         
         u[i][0].a-=u[i][1].a;
         u[i][0].b-=u[i][1].b;
         u[i][0].c-=u[i][1].c;
               
    }
    str p;p.a=0; p.b=0;
    p.c=0;
    backtr(1,n,p);  
    printf("%d",max);
    fclose(fin);
    fclose(fout);
    return 0;
}