Cod sursa(job #1999477)

Utilizator refugiatBoni Daniel Stefan refugiat Data 11 iulie 2017 11:36:38
Problema Aliens Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define INF 2000
#define MAXP 1005
#define MIJ 500
using namespace std;
ifstream si("aliens.in");
ofstream so("aliens.out");
int v[MAXP][MAXP];
int rez[600];
int p[3];
int desc(int x,int p)
{
    int r=0;
    while(x%p==0)
    {
        r++;
        x/=p;
    }
    return r;
}
inline void inmult(int x[],int a)
{
    int i,r=0;
    for(i=1;i<=x[0]||r;++i)
    {
        x[i]=x[i]*a+r;
        r=x[i]/10;
        x[i]%=10;
    }
    x[0]=i-1;
}
int main()
{
    int n;
    si>>n;
    for(int i=0;i<MAXP;++i)
        for(int j=0;j<MAXP;++j)
            v[i][j]=-INF;
    int s3,f3,d3;
    int s5,f5,d5;
    v[MIJ][MIJ]=0;
    int x,y;
    int min3,max3,min5,max5;
    min3=max3=min5=max5=0;
    for(int i=1;i<=n;++i)
    {
        si>>x>>y;
        //cout<<desc(x,2)<<' '<<desc(y,2)<<'\n';
        p[0]=desc(x,2)-desc(y,2);
        p[1]=desc(x,3)-desc(y,3);
        p[2]=desc(x,5)-desc(y,5);
        if(p[1]>=0)
        {
            s3=max3;
            f3=min3;
            d3=-1;
        }
        else
        {
            s3=min3;
            f3=max3;
            d3=1;
        }
        if(p[2]>=0)
        {
            s5=max5;
            f5=min5;
            d5=-1;
        }
        else
        {
            s5=min5;
            f5=max5;
            d5=1;
        }
        for(int j=s3;j!=f3+d3;j+=d3)
        {
            for(int k=s5;k!=f5+d5;k+=d5)
            {
                if(v[j+MIJ][k+MIJ]==-INF)
                    continue;
                if(v[MIJ+j+p[1]][MIJ+k+p[2]]<v[MIJ+j][MIJ+k]+p[0])
                {
                    v[MIJ+j+p[1]][MIJ+k+p[2]]=v[MIJ+j][MIJ+k]+p[0];
                    if(j+p[1]<min3)
                        min3=j+p[1];
                    if(j+p[1]>max3)
                        max3=j+p[1];
                    if(k+p[2]<min5)
                        min5=k+p[2];
                    if(k+p[2]>max5)
                        max5=k+p[2];
                }
            }
        }
    }
    double l2=log(2),l3=log(3),l5=log(5);
    int sx,sy;
    double sol=0,cur;
    for(int i=0;i<=max3;++i)
    {
        for(int j=0;j<=max5;++j)
        {
            if(v[MIJ+i][MIJ+j]<0)
                continue;
            cur=v[MIJ+i][MIJ+j]*l2+i*l3+j*l5;
            if(cur>sol)
            {
                sol=cur;
                sx=i;
                sy=j;
            }
        }
    }
    rez[0]=1;
    rez[1]=1;
    for(int i=1;i<=v[sx+MIJ][sy+MIJ];++i)
    {
        inmult(rez,2);
    }
    for(int i=1;i<=sx;++i)
        inmult(rez,3);
    for(int i=1;i<=sy;++i)
        inmult(rez,5);
    for(int i=rez[0];i;--i)
        so<<rez[i];
    return 0;
}