Cod sursa(job #479681)

Utilizator CezarMocanCezar Mocan CezarMocan Data 24 august 2010 20:15:25
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>

const int maxN = 2010;

using namespace std;

int N, V[maxN];
int s1[maxN], s2[maxN], val1, val2, nr1, nr2;
int rez[maxN];

inline int getShit(int sum) {
	return s1[1] * s2[sum - 1] + s2[1] * s1[sum - 1];
}

inline void mult(int A[], int B[], int C[]) {
	int i, j;

	C[0] = A[0] + B[0] - 1;
	for (i = 1; i <= A[0]; i++)
		for (j = 1; j <= B[0]; j++) 
			C[i + j - 1] += A[i] * B[j];

	for (i = 1; i <= C[0]; i++) {
		C[i + 1] += C[i] / 10;
		C[i] %= 10;
	}

	if (C[C[0] + 1] > 0)	C[0]++;

	while (C[C[0]] > 9) {
		C[C[0] + 1] = C[C[0]] / 10;
		C[C[0]] %= 10;
		C[0]++;
	}
}

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

	for (i = 1; i <= 9; i++) {
		scanf("%d", &nr);
		for (j = 1; j <= nr; j++)
			V[++N] = i;
	}

	for (i = 1; i <= N / 2; i++)
		swap(V[i], V[N - i + 1]);


	int ok = 0;
	for (i = 1; i <= N / 2; i++) {
		s1[i] = V[2 * i - 1];
		s2[i] = V[2 * i];

		if (ok == 0) {
			if (s1[i] > s2[i])
				ok = 1;
		}
		else {
			if (s1[i] > s2[i])
				swap(s1[i], s2[i]);
		}
	}

	nr1 = nr2 = N / 2;
	if (N % 2 == 1) {
		i = 1;
		while (s1[i] == s2[i] && i <= N / 2)
			i++;
		if (s1[i] < s2[i])
			s1[++nr1] = V[N];
		else
			s2[++nr2] = V[N];

	}

	for (i = 1; i <= nr1 / 2; i++)
		swap(s1[i], s1[nr1 - i + 1]);
	for (i = 1; i <= nr2 / 2; i++)
		swap(s2[i], s2[nr2 - i + 1]);
	s1[0] = nr1; s2[0] = nr2;

	mult(s1, s2, rez);

	for (i = rez[0]; i > 0; i--)
		printf("%d", rez[i]);

	return 0;
}