Cod sursa(job #467960)

Utilizator MKLOLDragos Ristache MKLOL Data 1 iulie 2010 16:31:58
Problema Prod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.75 kb
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<time.h>
using namespace std;

#define Nmax 15
#define Cmax 1010

struct big
{
    int l[2010];
} B[5],maxim,C,nui,maxa,maxb,C2;
int v[15],l[2010],N,S,a;

void afis(big nr1)
{
    for(int i=nr1.l[0];i>=1;--i)
        printf("%d",nr1.l[i]);
    printf("\n");
}

void inmu(big a,big b,big &c)
{

    int T=0;
    c.l[0]=a.l[0]+b.l[0]-1;
    for(int i=1;i<=a.l[0];++i)
        for(int j=1;j<=b.l[0];++j)
        {
            c.l[i+j-1]+=a.l[i]*b.l[j];
        }
        for(int i=1;i<=c.l[0];++i)
        {
            T=(c.l[i]+=T)/10;
            c.l[i]%=10;
        }
        if(T) c.l[++c.l[0]]=T;
}


int compara(big a,big b)
{
    if(b.l[0]>a.l[0])
        {
        return 1;
        }
    if(b.l[0]<a.l[0])
        {

        return -1;

        }
    for(int i=a.l[0];i>=1;--i)
        {
            if(a.l[i]>b.l[i])
               {
                 return -1;
               }
            if(b.l[i]>a.l[i])
            {

            return 1;

            }

        }
        return 0;
}

int main()
{

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

    for(int i=1;i<=9;++i)
        {
        scanf("%d",&v[i]);
        for(;v[i];--v[i])
            {
            l[++a]=i;
            }
        }

    reverse(l+1,l+a+1);

    N=a;

    int maxk=0,maxk2=0,q=0;

    while(N>1)
    {
        C=nui;
        maxk=l[++q],maxk2=l[++q];

        --N;--N;

        if(maxk==maxk2)
        {
            maxa.l[++maxa.l[0]]=maxk;
            maxb.l[++maxb.l[0]]=maxk2;
        }

        else
        {
             maxa.l[++maxa.l[0]]=maxk;
             maxb.l[++maxb.l[0]]=maxk2;

             reverse(maxa.l+1,maxa.l+maxa.l[0]+1);
             reverse(maxb.l+1,maxb.l+maxb.l[0]+1);

             inmu(maxa,maxb,C);

             reverse(maxb.l+1,maxb.l+maxb.l[0]+1);
             reverse(maxa.l+1,maxa.l+maxa.l[0]+1);

             maxa.l[maxa.l[0]]=maxk2;
             maxb.l[maxb.l[0]]=maxk;

             reverse(maxa.l+1,maxa.l+maxa.l[0]+1);
             reverse(maxb.l+1,maxb.l+maxb.l[0]+1);

             inmu(maxa,maxb,C2);

             reverse(maxb.l+1,maxb.l+maxb.l[0]+1);
             reverse(maxa.l+1,maxa.l+maxa.l[0]+1);

            if(compara(C2,C)>0)
            {
                 maxa.l[maxa.l[0]]=maxk;
                 maxb.l[maxb.l[0]]=maxk2;
            }
            else
            {
                 maxa.l[maxa.l[0]]=maxk2;
                 maxb.l[maxb.l[0]]=maxk;
            }

        }


    }

    C=nui;
    C2=nui;

    if(N==1)
    {
              maxk=l[++q];
              maxa.l[++maxa.l[0]]=maxk;

              reverse(maxa.l+1,maxa.l+maxa.l[0]+1);
              reverse(maxb.l+1,maxb.l+maxb.l[0]+1);

              inmu(maxa,maxb,C);

              reverse(maxb.l+1,maxb.l+maxb.l[0]+1);
              reverse(maxa.l+1,maxa.l+maxa.l[0]+1);


              maxb.l[++maxb.l[0]]=maxk;
              --maxa.l[0];
              reverse(maxa.l+1,maxa.l+maxa.l[0]+1);
              reverse(maxb.l+1,maxb.l+maxb.l[0]+1);

              inmu(maxa,maxb,C2);

              reverse(maxb.l+1,maxb.l+maxb.l[0]+1);
              reverse(maxa.l+1,maxa.l+maxa.l[0]+1);

              --maxb.l[0];
        //    afis(C2);
        //    afis(C);
            if(compara(C2,C)>0)
            {

                 maxa.l[++maxa.l[0]]=maxk;

            }

            else
            {

                 maxb.l[++maxb.l[0]]=maxk;
            }
    }

    C=nui;

    reverse(maxb.l+1,maxb.l+maxb.l[0]+1);
    reverse(maxa.l+1,maxa.l+maxa.l[0]+1);

    //afis(maxa);
    //afis(maxb);
    inmu(maxa,maxb,C);
    afis(C);


}