Cod sursa(job #466646)

Utilizator freak93Adrian Budau freak93 Data 27 iunie 2010 12:35:32
Problema Prod Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.39 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const char iname[]="prod.in";
const char oname[]="prod.out";
const int maxn=1005;

int a[maxn],b[maxn],g[10],i,x,y,ok;

void mul(int A[], int B[])
{
      int i, j, t, C[1005];
      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));
}

int get()
{
    for(int i=9;i;--i)
        if(g[i])
        {
            --g[i];
            return i;
        }
    return 0;
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);

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

    ok=1;
    x=get();
    y=get();
    while(1)
    {
        if(x==0)
            break;
        if(y==0)
        {
            ++g[x];
            break;
        }
        a[++a[0]]=x,b[++b[0]]=y,ok=0;
        if(x!=y)
            break;
        x=get();
        y=get();
    }
    x=get();
    while(1)
    {
        if(x==0)
            break;
        if(ok==0)
            b[++b[0]]=x,ok=1;
        else
            a[++a[0]]=x,ok=0;
        x=get();
    }

    reverse(a+1,a+a[0]+1);
    reverse(b+1,b+b[0]+1);
    mul(a,b);
    printf("%d",a[a[0]]);
    for(i=a[0]-1;i;--i)
        printf("%d",a[i]);

    printf("\n");
}