Cod sursa(job #67585)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 25 iunie 2007 12:17:12
Problema Sarpe Scor 90
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.52 kb
#include <stdio.h>
#include <string.h>
const int n_max = 3010;
int a[n_max],
	b[n_max],
	c[n_max];
long long sol;
int i, n, j;

void add(int A[], int B[])
{
	int i, t = 0;
	for (i = 1; i <= A[0] || i <= B[0] || t; ++ i)
	{
		t += A[i] + B[i];
		A[i] = t%10;
		t = t/10;
	}
	A[0] = i-1;
}

void sub (int A[], int B[])
{
	int i, t;
	for (i = 1; i <= A[0]; ++ i)
	{
		t = A[i] - B[i];
		if (t < 0)
		{
			t +=10;
			-- A[i+1];
		}
		A[i] = t;
	}
	for (; A[A[0]] == 0; -- A[0])
		;
}

void mul(int A[], int B[])
{
	int i, j, t = 0, C[n_max];
	for (i = 0; i < n_max; ++ i)
		C[i] = 0;
	for (i = 1; i <= A[0]; ++ i)
	{
		t = 0;
		for (j = 1; j <= B[0] || t; ++ j)
		{
			t += C[j + i - 1] + (A[i] * B[j]);
			C[j + i -1] = t % 10;
			t = t/10;
		}
	}
	C[0] = i + j;
	for (; C[C[0]] == 0 && C[0] > 0; -- C[0])
		;
	memcpy(A, C, sizeof(C));
}

void read(int A[])
{
	int i;
	char s[2000];
	scanf("%s", s);
	A[0] = strlen(s);
	for (i = A[0] - 1; i >= 0; -- i)
		A[A[0] - i] = s[i] - '0';
}
void print(int A[])
{
	int i;
	for (i = A[0] ; i > 0; --i)
		printf("%d", A[i]);
	printf("\n");
	fflush(stdout);
}
int main()
{
	freopen("sarpe.in","r",stdin);
	freopen("sarpe.out","w",stdout);
	read(a);
	if (a[0] == 1 && a[1] == 1)
	{
		printf("1\n");
		return 0;
	}
	//print(a);
	memcpy(b,a, sizeof(a));
	c[0] = 1;
	c[1] = 1;
	sub(b,c);
	//print(b);
	c[0] = 1;
	c[1] = 2;
	mul(a,b);
	//print(a);
	mul(a,c);
	//print(a);
	c[0] = 1;
	c[1] = 4;
	add(a,c);
	print(a);
	return 0;
}