Cod sursa(job #467560)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 29 iunie 2010 13:23:38
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define maxn 2100

long n, sum, poz, comp, w;
long f[11], a[maxn], b[maxn], c[maxn];

void inm()
{
    for(long i=1; i<=a[0]; i++)
    {
        long t=0;
        long j;
        for(j=1; j<=b[0] || t; j++)
        {
            t=t+c[i+j-1]+a[i]*b[j];
            c[i+j-1]=t%10;
            t/=10;
        }
        c[0]=max(c[0], i+j-2);
    }
}

long getcif()
{
    while(f[poz]==0)
        --poz;
    f[poz]--;
    return poz;
}

int main()
{
    freopen("prod.in", "r", stdin);
    freopen("prod.out", "w", stdout);
    for(long i=1; i<=9; ++i)
    {
        scanf("%d", &f[i]);
        sum+=f[i];
    }
    if(sum%2==1)
    {
        sum++;
        w=1;
        f[0]=1;
    }
    poz=9;
    a[0]=b[0]=sum/2;
    a[a[0]]=getcif();
    b[b[0]]=getcif();
    if(a[a[0]]>b[b[0]])
        comp=1;
    else
    if(a[a[0]]<b[b[0]])
        comp=2;
    for(long i=sum/2-1; i; --i)
    {
        if(comp==2)
        {
            a[i]=getcif();
            b[i]=getcif();
        }
        else
        {
            b[i]=getcif();
            a[i]=getcif();
        }
        if(comp==0 && a[i]!=b[i])
        {
            if(a[i]>b[i])
                comp=1;
            else
                comp=2;
        }
    }
    inm();
    c[0]=1500;
    while(c[c[0]]==0)
        --c[0];
    for(long i=c[0]; i>w; --i)
    {
        printf("%d", c[i]);
    }
    printf("\n");
    return 0;
}