Cod sursa(job #2058814)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 6 noiembrie 2017 10:38:42
Problema Aliens Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include<bits/stdc++.h>
#define inf 30000
#define baza 10000
using namespace std;
typedef struct tip
{
    int x2,x3,x5;
    tip operator-(const tip& a)
    {
        return {x2-a.x2,x3-a.x3,x5-a.x5};
    }
};
short dp[2][850][850];
inline tip f(int x)
{
    int x2=0,x3=0,x5=0;
    while(!(x%2))
    {
        x/=2;
        x2++;
    }
    while(!(x%3))
    {
        x/=3;
        x3++;
    }
    while(!(x%5))
    {
        x/=5;
        x5++;
    }
    return {x2,x3,x5};
}
tip val;
int n,x,y;
inline void Copiere(int a[],int b[])
{
 //   memcpy(a,b,sizeof(b));
    for(int i=0;i<=1000;i++) a[i]=b[i];
}
inline void scrie(int x)
{
    if(x<0.1) printf("00000");
        else
    if(x<1) printf("0000");
        else
    if(x<10) printf("000");
        else
    if(x<100) printf("00");
        else
    if(x<1000) printf("0");
    printf("%d",x);
}
inline void Inmultire(int a[],int b[])
{
    int t=0,i,j;
    int c[1005];
    memset(c,0,sizeof(c));
    for(i=1;i<=a[0];i++)
    {
        for(j=1;j<=b[0] || t;j++)
        {
            c[i+j-1]+=(t+a[i]*b[j]);
            t=c[i+j-1];
            c[i+j-1]%=baza;
            t/=baza;
        }
        if((i+j-2)>c[0]) c[0]=i+j-2;
    }
    Copiere(a,c);
}
int aux[1005],p[1005];
int main()

{
    freopen("aliens.in","r",stdin);
    freopen("aliens.out","w",stdout);

    scanf("%d",&n);
    for(int j=0;j<=840;j++)
        for(int k=0;k<=840;k++) dp[0&1][j][k]=-inf;
    dp[0][420][420]=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&x,&y);
        tip e=f(x)-f(y);
        for(int j=0;j<=840;j++)
            for(int k=0;k<=840;k++)
                dp[i&1][j][k]=-inf;
        dp[i&1][420][420]=0;
        for(int j=0;j<=840;j++)
            for(int k=0;k<=840;k++)
        {
            if(dp[(i-1)&1][j][k]==-inf) continue;
            dp[i&1][j][k]=max(dp[i&1][j][k],dp[(i-1)&1][j][k]);
            dp[i&1][j+e.x3][k+e.x5]=max(dp[i&1][j+e.x3][k+e.x5],(short)(dp[(i-1)&1][j][k]+e.x2));
        }
    }
    for(int j=420;j<=840;j++)
        for(int k=420;k<=840;k++)
    {
        if(dp[n&1][j][k]<0) continue;
        double x1=dp[n&1][j][k]*log((double)2)+(j-420)*log((double)3)+(k-420)*log((double)5);
        double x2=val.x2*log((double)2)+val.x3*log((double)3)+val.x5*log((double)5);
        if(x1>x2 && dp[n&1][j][k]>=0)
        {
            val.x2=(int)dp[n&1][j][k];
            val.x3=j-420;
            val.x5=k-420;
        }
    }
  //  printf("%d %d %d\n",val.x2,val.x3,val.x5);
    aux[0]=1;
    aux[1]=1;
    p[0]=1;
    p[1]=2;
    for(int i=1;i<=val.x2;i++)
        Inmultire(aux,p);
    p[1]=3;
    for(int i=1;i<=val.x3;i++)
        Inmultire(aux,p);
    p[1]=5;
    for(int i=1;i<=val.x5;i++)
        Inmultire(aux,p);
    printf("%d",aux[aux[0]]);
    for(int i=aux[0]-1;i>=1;i--)
        scrie(aux[i]);
    printf("\n");
    return 0;
}