Cod sursa(job #466736)

Utilizator irene_mFMI Irina Iancu irene_m Data 27 iunie 2010 13:55:05
Problema Prod Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.68 kb
#include <cstdio>
#define infile "prod.in"
#define outfile "prod.out"
#define MaxN 1024

int cif[10];
int N,a[MaxN],b[MaxN],v[MaxN],rez[MaxN*2];
int sol[MaxN*2];
int A,B,V,S,R;

void read()
{
      int i,j;
      for(i=1;i<=9;i++)
      {
            scanf("%d",&cif[i]);
            for(j=1;j<=cif[i];j++)
                  v[++N]=i;
      }
}

void inmultire(int poz)
{
      A=B=0;
      int i,j,T=0;
      for(i=1;i<=poz;i++)
            a[++A]=v[i];
      for(i=N;i>poz;i--)
            b[++B]=v[i];

      R=A+B-1;
      for(i=1;i<=A+B;i++)
            rez[i]=0;

      for(i=1;i<=A;i++)
            for(j=1;j<=B;j++)
                  rez[i+j-1]+=a[i]*b[j];

      for(i=1;i<=R;i++)
      {
            T=(rez[i]+=T)/10;
            rez[i]%=10;
      }

      if(T)
            rez[++R]=T;
}

int verif()
{
      if(R>S)
            return 1;
      if(R<S)
            return 0;

      int i=R;
      while(i>0 && sol[i]==rez[i])
            i--;

      if(i==0)
            return 0;

      if(sol[i]<rez[i])
            return 1;
      return 0;
}

void compara()
{
      if(verif())
      {
            int i;
            for(i=1;i<=R;i++)
                  sol[i]=rez[i];
            S=R;
      }
}

void solve()
{
      int i;
      for(i=1;i<N;i++)
      {
            inmultire(i);
            compara();
      }
}


void write()
{
      int i;
      for(i=S;i>=1;i--)
            printf("%d",sol[i]);
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}