Cod sursa(job #69450)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 3 iulie 2007 01:41:40
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <string>
#include <algorithm>
#define fin  "sarpe.in"
#define fout "sarpe.out"
#define Cmax 2000000

using namespace std;

int a[Cmax],b[Cmax],c[Cmax];

void read(int a[])
{
	int i;
	char buff;
	buff=getc(stdin);
	a[0]=0;
	while (buff!='\n' && buff!=EOF) 
	{
		if (buff >= '0' && buff <='9')
			a[++a[0]]=buff-'0';
		buff=getc(stdin);
	}
	for (i=1;i<=a[0]/2;++i)
		swap(a[i],a[a[0]-i+1]);
}

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

void multb(int a[],int b[])	//mare cu mare
{
	int i,j,t,c[Cmax];
	memset(c,0,sizeof(c));
	for (i=1;i<=a[0];++i)
	{
		for (t=0,j=1;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));
}

void add(int a[],int b[])
{
	int 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 subs(int a[],int b) 	//b e cifra
{
	int i;

	a[1]-=b;
	for (i=1;i<=a[0] && a[i]<0;++i)
		if (a[i]<0)
		{
			a[i]+=10;
			--a[i+1];
		}
	for (;a[a[0]]==0 && a[0]>1;--a[0]);
}

void print(int a[]) 
{
	int i;

	for (i=a[0];i>0;--i)
		printf("%d",a[i]);
	printf("\n");
}
int main() 
{
	freopen(fin,"r",stdin); 
	freopen(fout,"w",stdout);

	read(a); 
	memcpy(b,a,sizeof(a));
	memcpy(c,a,sizeof(a));
	mults(a,4);
	subs(b,2); 
	subs(c,1);
	multb(b,c);
	mults(b,2);
	add(a,b);

	print(a);	

	return 0;
}