Cod sursa(job #466856)

Utilizator blasterzMircea Dima blasterz Data 27 iunie 2010 19:31:15
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define NRCIFRE 5002
using namespace std;
int nr[10];

int a[5005], b[5005];
int na, nb;

inline void mul (int a[], int b[])
{
	int i, j, t, c[NRCIFRE];

	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));
}

inline void afis (int a[])
{
	for (int i = a[0]; i ; --i)
		printf ("%d", a[i]);
	printf ("\n");
}

inline int cmp (int na)
{
	for (int i = 1; i <= na; ++i)
		if (a[i] == b[i]);
		else
			if (a[i] < b[i]) return 1;
			else
				if (a[i] > b[i]) return -1;
	return 0;

}
void solve ()
{
	int i, j;
	int c;

	int maimare = 0;

	for (i = 9; i >= 1; --i)
	{
		c = i;
		for (j = 1; j <= nr[i]; ++j)
		{

			if (na < nb)
				a[++na] = c;
			else
			if (na > nb)
				b[++nb] = c;
			else
			{
				maimare = cmp (na);
				if (maimare == 1)
					a[++na] = c;
				else
					b[++nb] = c;

			}
		}

			

	}


	reverse (a + 1, a + na + 1);
	reverse (b + 1, b + nb + 1);

	a[0] = na;
	b[0] = nb;

	mul (a, b);

	afis (a);
}

int main ()
{
	freopen ("prod.in", "r", stdin);
	freopen ("prod.out", "w", stdout);
	int i;
	for (i = 1; i <= 9; ++i)
		scanf ("%d ", &nr[i]);


	solve ();

	return 0;
}