Cod sursa(job #112527)

Utilizator sealTudose Vlad seal Data 5 decembrie 2007 21:14:59
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<stdio.h>
#include<math.h>
#define Nm 50
#define Log3vm 18
#define Log5vm 12
#define Cm 450
#define Imp -2000
#define max(a,b) ((a)>(b)?(a):(b))
#define AA(i,j) A[(i)+Log3vm*Nm][(j)+Log5vm*Nm]
short A[Log3vm*Nm<<1|1][Log5vm*Nm<<1|1];
int Ans[Cm];

void mul(int x)
{
    int i,t=0;

    for(i=1;i<=Ans[0] || t;++i,t/=10)
        Ans[i]=(t+=Ans[i]*x)%10;
    Ans[0]=i-1;
}

int main()
{
    int n,i,j,k,x,p2,p3,p5,bi,bj,ei,ej,pi,pj,im,jm;
    double m;

    freopen("aliens.in","r",stdin);
    scanf("%d",&n);
    
    for(i=-Log3vm*n;i<=Log3vm*n;++i)
        for(j=-Log5vm*n;j<=Log5vm*n;++j)
            AA(i,j)=Imp;
    AA(0,0)=0;
    
    for(k=0;k<n;++k)
    {
        p2=p3=p5=0;
        scanf("%d",&x);
        while(x%2==0)
            x/=2, ++p2;
        while(x%3==0)
            x/=3, ++p3;
        while(x%5==0)
            x/=5, ++p5;

        scanf("%d",&x);
        while(x%2==0)
            x/=2, --p2;
        while(x%3==0)
            x/=3, --p3;
        while(x%5==0)
            x/=5, --p5;

        if(p3<0)
            bi=-Log3vm*k, ei=Log3vm*k+1, pi=1;
        else
            bi=Log3vm*k, ei=-Log3vm*k-1, pi=-1;
        if(p5<0)
            bj=-Log5vm*k, ej=Log5vm*k+1, pj=1;
        else
            bj=Log5vm*k, ej=-Log5vm*k-1, pj=-1;
            
        for(i=bi;i!=ei;i+=pi)
            for(j=bj;j!=ej;j+=pj)
                if(AA(i,j)!=Imp)
                    AA(i+p3,j+p5)=max(AA(i+p3,j+p5),AA(i,j)+p2);
    }

    m=-1;
    for(i=0;i<=Log3vm*n;++i)
        for(j=0;j<=Log5vm*n;++j)
            if(AA(i,j)>=0 && AA(i,j)*log(2)+i*log(3)+j*log(5)>m)
                m=AA(i,j)*log(2)+i*log(3)+j*log(5), im=i, jm=j;
                
    Ans[0]=Ans[1]=1;
    while(AA(im,jm)--)
        mul(2);
    while(im--)
        mul(3);
    while(jm--)
        mul(5);

    freopen("aliens.out","w",stdout);
    for(i=Ans[0];i;--i)
        printf("%d",Ans[i]);
    printf("\n");
    return 0;
}