Cod sursa(job #73658)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 20 iulie 2007 10:19:21
Problema Sarpe Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<string.h>
#define VAL 1000000
long n,w;
long q[VAL],e[VAL],C[VAL];

void citire()
{
	freopen("sarpe.in","r",stdin);
	scanf("%ld", &n);
	fclose(stdin);
}

void printare()
{
	for (long i=q[0]; i>=1; i--)
		printf("%d",q[i]);
}

void transf(long q, long a[VAL])
{
	while (q>0)
	{
		a[++a[0]]=q%10;	
		q/=10;
	}
}

void mult(long q[VAL], long e[VAL])
{  
	long i, j, t;
    memset(C, 0, sizeof(C));  
    for (i = 1; i <= q[0]; i++)  
    {
		for (t=0, j=1; j <= e[0] || t; j++, t/=10)  
			C[i+j-1]=(t+=C[i+j-1]+q[i]*e[j])%10;  
		if (i + j - 2 > C[0]) 
			C[0] = i + j - 2;
	}
    memcpy(q, C, sizeof(C));
}

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

void numere_mari()
{
	memset(e,0,sizeof(e));
	memset(q,0,sizeof(q));
	transf(n-1,e);
	transf(n-2,q);
    mult(q,e);
	memset(e,0,sizeof(e));
	transf(2,e);
	mult(q,e);
	memset(e,0,sizeof(e));
	long long l=4*n;
	transf(l,e);
	add(q,e);

}

int main()
{
	citire();
	freopen("sarpe.out","w",stdout);
	if (n>1)
	{
		//w=4*n+2*(n-1)*(n-2);
		numere_mari();
		printare();
	}
	else 
	{
		w=2;
		printf("%ld",w);
	}
	fclose(stdout);
	return 0;
}