Cod sursa(job #114406)

Utilizator sims_glAlexandru Simion sims_gl Data 14 decembrie 2007 06:33:17
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <string.h>

#define lm 5000
#define baza 10

int a[lm], temp[lm], sol[lm];

void sum(int a[lm], int b[lm])
{
	int i, t = 0;

	for (i = 1; i <= a[0] || i <= b[0] || t; ++i, t /= baza)
		a[i] = (t += a[i] + b[i]) % baza;

	a[0] = i - 1;
}

void prod(int a[lm], int b)
{
	int i, t = 0;

	for (i = 1; i <= a[0] || t; ++i, t /= baza)
		a[i] = (t += a[i] * b) % baza;

	a[0] = i - 1;
}

void prod2(int a[lm], int b[lm])
{
	int i, j, t, c[lm];

	memset(c, 0, sizeof(c));

	for (i = 1; i <= a[0]; ++i) {
		for (t = 0, j = 1; j <= b[0] || t; ++j, t /= baza)
			c[i + j - 1] = (t += c[i + j - 1] + a[i] * b[j]) % baza;

		if (i + j - 2 > c[0])
			c[0] = i + j - 2;
	}

	memcpy(a, c, sizeof(c));
}

void dec(int a[lm])
{
	int i;

	for (--a[1], i = 1; a[i] < 0; ++i) {
		a[i] = 9;
		--a[i + 1];
	}

	for (; a[0] > 1 && !a[a[0]]; --a[0]);
}

int main()
{
	char ch;

	freopen("sarpe.in", "r", stdin);
	freopen("sarpe.out", "w", stdout);

	while (!feof(stdin)) {
		scanf(" %c ", &ch);

		if (ch >= '0' && ch <= '9')
			a[++a[0]] = ch - '0';

		for (int i = 1; 2 * i <= a[0]; ++i) {
			int aux;

			aux = a[i];
			a[i] = a[a[0] - i + 1];
			a[a[0] - i + 1] = aux;
		}
	}

	sum(sol, a);
	prod(sol, 4);
	dec(a);
	sum(temp, a);
	dec(a);
	prod2(temp, a);
	prod(temp, 2);
	sum(sol, temp);
	
	for (int i = sol[0]; i > 0; --i)
		printf("%d", sol[i]);
	printf("\n");

	return 0;
}