Cod sursa(job #77805)

Utilizator marius135Dumitran Adrian Marius marius135 Data 14 august 2007 20:54:35
Problema Sarpe Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#include<string.h>
#define baza 10
#define end 400

char c[102];
long t[402],v[402];

void normal(long *q,long n)
{
	long i;
	for(i=end;i>=end-n+1;i--)
	{
		q[i] += q[i+1]/baza;
		q[i+1] %= baza;
	}
	q[0] = end-i;
	while(q[i+1]> baza)
	{
		q[i] += q[i+1]/baza;
		q[i+1] %= baza;
		i--;
		q[0]++;
	}
}
void inmult(long *a,long *b)
{
	long q[402],i,j;
	memset(q,0,sizeof(q));
	for(i=end-a[0]+1;i<=end;i++)
		for(j=end-b[0]+1;j<=end;j++)
			q[end-(end-i)-(end-j)]+=a[i]*b[j];
	normal(q,a[0]+b[0]-1);
	for(i=0;i<=end;i++)
		a[i] = q[i];

}
void inmultscalar(long *a,long b)
{
	long i;
	for(i=end;i>=end-a[0]+1;i--)
		a[i]*=2;
	normal(a,a[0]);
	
}

void scade(long *a,long *b)
{
	long i;
	for(i=end;i>=end-a[0]+1;i--)
	{
		a[i]-=b[i];
		if(a[i]<0)
			{
			a[i]+=baza;
			a[i-1]--;
			}
	}
	if(a[end-a[0]+1]==0) a[0]--;
}
void addscalar(long *a,long b)
{
	a[end]+=b;
	normal(a,a[0]);
}
int main()
{
	
	freopen("sarpe.in","r",stdin);
	freopen("sarpe.out","w",stdout);
	scanf("%s",c);
	long poz,i;
	for(i=end-strlen(c)+1,poz = 0;i<=end;i++,poz++)
		{
		v[i] = c[poz]-'0' ;
		t[i] = v[i];
		}
	v[0] = strlen(c);
	t[0] = v[0];
	
	inmult(t,v);
	
	inmultscalar(t,2);
	inmultscalar(v,2);
	scade(t,v);
	addscalar(t,4);
	
	for(i=end-t[0]+1;i<=end;i++)
		printf("%ld",t[i]);
	if(t[0]==0) printf("2");
	printf("\n");
	
	return 0;
}