Cod sursa(job #467554)

Utilizator savimSerban Andrei Stan savim Data 29 iunie 2010 13:10:04
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAX_N 1010
#define LIM 2015

int cif[10];
int A[MAX_N], B[MAX_N];
int rez[2 * MAX_N], aux[2 * MAX_N], start = LIM;

int comp() {
	if (A[0] > B[0])
		return 1;
	if (A[0] < B[0])
		return 0;

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

	return 0;
}

int main() {
	freopen("prod.in", "r", stdin);
	freopen("prod.out", "w", stdout);

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

	for (int i = 9; i > 0; i--) 
		while (cif[i]) {
			if (comp())
				B[++B[0]] = i;
			else
				A[++A[0]] = i;
        	cif[i]--;
		}

	if (comp() == 0) {
		for (int i = 0; i <= A[0]; i++)
			aux[i] = A[i];
		memset(A, 0, sizeof(A));

		for (int i = 0; i <= B[0]; i++)
			A[i] = B[i];
		memset(B, 0, sizeof(B));

		for (int i = 0; i <= aux[0]; i++)
			B[i] = aux[i];
		memset(aux, 0, sizeof(aux));
	}

	for (int i = B[0]; i > 0; i--) {
		memset(aux, 0, sizeof(aux));

		int trans = 0, poz = start;
		for (int j = A[0]; j > 0; j--) {
        	aux[poz] = aux[poz] + A[j] * B[i] + trans;
			trans = aux[poz] / 10;
			aux[poz] %= 10;

			poz--;
		}
		aux[poz] += trans;

		for (int j = start; j >= poz; j--) {
        	rez[j] = rez[j] + aux[j];
			rez[j - 1] += rez[j] / 10;
			rez[j] %= 10;
		}
	
		start--;
	}

	for (int i = LIM; i >= 1; i--) {
		rez[i - 1] += rez[i] / 10;
    	rez[i] %= 10;
	}

	start = 0;
	for (int i = 1; i <= LIM; i++)
		if (rez[i]) {
        	start = i;
			break;
		}

	for (int i = start; i <= LIM; i++)
		printf("%d", rez[i]);
	printf("\n");

	return 0;
}