Cod sursa(job #67495)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 25 iunie 2007 10:32:07
Problema Sarpe Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.24 kb
#include <stdio.h>
#include <string.h>

#define MAXL 2005

char s[MAXL];
int N[MAXL], aux[MAXL];

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

int C[MAXL];
inline void mul( int A[], int B[] )
{
	memset( C, 0, sizeof(C) );
	int i, j, t = 0;
	for (i = 1; i <= A[0]; i++)
	{
		for (j = 1, t = 0; 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 print( int A[] )
{
	int i = 0;
	for (i = A[0]; i; i--)
		printf("%d", A[i]);
	printf("\n");
}

int main()
{
	freopen("sarpe.in", "rt", stdin);
	freopen("sarpe.out", "wt", stdout);

	fgets(s, MAXL, stdin);
	int i;
	for (i = 0; s[i] && '0' <= s[i] && s[i] <= '9'; i++);
	for (i--; i >= 0; i--)
		N[ ++N[0] ] = s[i] - '0';

	if (N[0] == 1 && N[1] == 1)
	{
		printf("2\n");
		return 0;
	}

	memcpy(aux, N, sizeof(aux));
	N[1]--;
	for (int i = 1; i <= N[0] && N[i] < 0; i++)
		N[i] += 10,
		N[i + 1]--;
	for (; N[0] && !N[ N[0] ]; N[0]--);

	mul(N, aux);
	mul(N, 2);

	N[1] += 4;
	for (i = 1; i <= N[0] && N[i] >= 10; i++)
		N[i] -= 10,
		N[i + 1]++;
	if (N[ N[0] + 1 ])
		N[0]++;

	print(N);

	return 0;
}