Cod sursa(job #709693)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 8 martie 2012 14:50:45
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define NMax 2005

using namespace std;

int ND[10], N[2][NMax];

inline void Multiply (int A[], int B[])
{
	int i, j, T, C[NMax];
	memset (C, 0, sizeof (C));
	for (i=1; i<=A[0]; ++i)
	{
		for (j=1, T=0; j<=B[0] or 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));
}

inline int Compare (int A[], int B[])
{
	if (A[0]<B[0]) return 0;
	if (A[0]>B[0]) return 1;
	for (int i=1; i<=A[0]; ++i)
	{
		if (A[i]<B[i]) return 0;
		if (A[i]>B[i]) return 1;
	}
	return 0;
}

void Solve ()
{
	for (int i=9; i>0; --i)
	{
		for (; ND[i]>0; --ND[i])
		{
			int Index=Compare (N[0], N[1]);
			N[Index][++N[Index][0]]=i;
		}
	}
	reverse (N[0]+1, N[0]+N[0][0]+1);
	reverse (N[1]+1, N[1]+N[1][0]+1);
	Multiply (N[0], N[1]);
}

void Read ()
{
	freopen ("prod.in", "r", stdin);
	for (int i=1; i<10; ++i) scanf ("%d", &ND[i]);
}

void Print ()
{
	freopen ("prod.out", "w", stdout);
	for (int i=N[0][0]; i>0; --i) printf ("%d", N[0][i]);
}

int main ()
{
	Read ();
	Solve ();
	Print ();
	return 0;
}