Cod sursa(job #69489)

Utilizator damaDamaschin Mihai dama Data 3 iulie 2007 11:51:36
Problema Sarpe Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define nmax 500000


char line[nmax];
int n[nmax], t1[nmax], t2[nmax], sol[nmax];

void mul(int*, int*, int);
void mul(int*, int*, int*);
void add(int*, int*, int*);

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

	gets(line);
	len = strlen(line);

	for(i = len; i >= 0; --i)
	{
		if(isdigit(line[i]))
		{
			n[++n[0]] = line[i] - '0';
		}
	}
	
	if(n[0] == n[1] && n[1] == 1)
	{
		printf("2\n");
		return 0;
	}
	for(i = n[0]; i >= 0; --i)
	{
		t1[i] = t2[i] = n[i];
	}

	t1[1] -= 1;
	for(i = 1; i < t1[0] && t1[i] < 0; t1[i] += 10, t1[i + 1] -= 10, ++i);
	if(t1[t1[0]] == 0)
		--t1[0];
	t2[1] -= 2;
	for(i = 1; i < t1[0] && t1[i] < 0; t1[i] += 10, t1[i + 1] -= 10, ++i);
	if(t2[t2[0]] == 0)
		--t2[0];
	mul(sol, t1, t2);
	mul(sol, sol, 2);
	mul(n, n, 4);
	add(sol, sol, n);

	for(i = sol[0]; i > 0; --i)
	{
		printf("%d", sol[i]);
	}
	printf("\n");

	return 0;
}

void mul(int* c, int* a, int* b)
{
	int i, j, t;
	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;
	}
}

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

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