Cod sursa(job #467369)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 28 iunie 2010 15:37:13
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 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;
char c[nmax];
int nrc;

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,poz=0;
    char mare;
    nr1=nr2=0;

    for(i=9;i>=1;--i)
	{
		while(v[i])
		{
			if(nr1<nr2)
			{
				a[++nr1]=i;
				v[i]--;
				continue;
			}
			if(nr2<nr1)
			{
				b[++nr2]=i;
				v[i]--;
				continue;
			}
			if(a[poz]==b[poz])
				++poz;
			if(a[poz]<b[poz])
				a[++nr1]=i;
			else
				b[++nr2]=i;
			v[i]--;
		}
	}



    /*for (i=1;i<=nr1;++i) printf("%d ", a[i]);
    printf("\n");
    for (i=1;i<=nr2;++i) printf("%d ", b[i]);
    printf("\n");
    for (i=1;i<=nrc;++i) printf("%c ", c[i]);
    printf("\n");*/
    //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;
}