Cod sursa(job #466597)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 27 iunie 2010 11:38:09
Problema Prod Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 2.96 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;

#define file_in "prod.in"
#define file_out "prod.out"

#define nmax 9011

int v[11];
int a[nmax];
int b[nmax];
int nr1,nr2;

void citire()
{
    int i;
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    for (i=1;i<=9;++i)
         scanf("%d", &v[i]);

}

void mul(int A[], int B[])
{
      int i, j, t, C[nmax];
      memset(C, 0, sizeof(C));
      for (i = 1; i <= A[0]; i++)
      {
              for (t=0, j=1; j <= B[0] || t; j++, t/=10)
                      C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
              if (i + j - 2 > C[0]) C[0] = i + j - 2;
      }
      memcpy(A, C, sizeof(C));
}


void solve()
{
    int i,j;
    char mare;
    nr1=nr2=0;
    mare=' ';
    for (i=9;i>=1;--i)
    {
         if (v[i]%2==0)
         {
             for (j=1;j<=v[i]/2;++j)
             {
                 a[++nr1]=i;
                 b[++nr2]=i;
             }
         }
         else
         if (mare==' ' || mare=='A')
         {
             for (j=1;j<=v[i]/2;++j)
             {
                 a[++nr1]=i;
                 b[++nr2]=i;
             }
             a[++nr1]=i;

             //caut urmatoru pentru a baga in b
             for (j=i-1;j>=1;--j)
                  if (v[j]!=0)
                     {
                         v[j]--;
                         b[++nr2]=j;
                         break;
                     }
                     mare='B';
                     //printf("A intrat la %d\n", i);
         }
        else
             if (mare=='B')
             {
                  for (j=1;j<=v[i]/2;++j)
                 {
                 a[++nr1]=i;
                 b[++nr2]=i;
                 }
                 b[++nr2]=i;
             //caut urmatoru pentru a baga in a
             for (j=i-1;j>=1;--j)
                  if (v[j]!=0)
                     {
                         v[j]--;
                         a[++nr1]=j;
                         break;
                     }
                     mare='A';
              }

         }


    //for (i=1;i<=nr1;++i) printf("%d ", a[i]);
    //printf("\n");
    //for (i=1;i<=nr2;++i) printf("%d ", b[i]);
    //le inversez
    int st,dr,aux;
    st=1;
    dr=nr1;
    while(st<=dr)
    {
        aux=a[st];
        a[st]=a[dr];
        a[dr]=aux;
        st++;
        dr--;
    }

     st=1;
    dr=nr2;
    while(st<=dr)
    {
        aux=b[st];
        b[st]=b[dr];
        b[dr]=aux;
        st++;
        dr--;
    }

    a[0]=nr1;
    b[0]=nr2;

    if (a[0]>b[0])
    {
        mul(a,b);
        for (i=a[0];i>=1;--i) printf("%d", a[i]);
    }
    else
    {
        mul(b,a);
        for (i=b[0];i>=1;--i) printf("%d", b[i]);
    }

}

int main()
{
    citire();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;
}