Cod sursa(job #145059)

Utilizator znakeuJurba Andrei znakeu Data 28 februarie 2008 12:36:20
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <string.h>
#define NR_CIFRE 10000
// 4N + 2(N-1)(N-2)

void reset(int A[],int l)
{
	int i;
	for (i=0; i<=l; i++)
		A[i]=0;	
}

void transform(int A[], int B)
{
	do
	{
		A[++A[0]]=B%10;
		B/=10;
	}
	while (B);
}

void copyV(int A[], int B[])
{
	int i = 0;
	for (i=0; i<=B[0]; i++)
		A[i]=B[i];	
}

void sub(int A[], int B[])  
{  
    int i, t = 0;  
    for (i = 1; i <= A[0]; i++)  
        A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;  
    for (; A[0] > 1 && !A[A[0]]; A[0]--);  
}

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 mulm(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;  
}  

void mulM(int A[], int B[])  
{  
    int i, j, t, C[NR_CIFRE];  
    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 invert(int A[])
{
	int i,t;
	for (i=1; i<=A[0]/2; i++)
	{
		t=A[i];
		A[i]=A[A[0]-i+1];
		A[A[0]-i+1]=t;
	}
}

int main()
{
	int e,i;
	char c;
	int A[NR_CIFRE],B[NR_CIFRE],A1[NR_CIFRE],A2[NR_CIFRE];
	
	FILE *in=fopen("sarpe.in","r");
	FILE *out=fopen("sarpe.out","w");
	
	reset(A,NR_CIFRE-1);
	reset(A1,NR_CIFRE-1);
	reset(A2,NR_CIFRE-1);
	reset(B,NR_CIFRE-1);

	
	e=fscanf(in,"%c",&c);
	while (c>='0' && c<='9')
	{
		A[0]++;
		A[A[0]]=c-'0';
		e=fscanf(in,"%c",&c);
	}
	invert(A);
	if (A[0]>1 || A[1]!=1)
	{
		B[0]=1;
		B[1]=1;
		
		copyV(A1,A);
		copyV(A2,A);
		
		sub(A1,B);
		B[1]=2;
		sub(A2,B);
		
		mulM(A1,A2);
		mulm(A1,2);
		
		mulm(A,4);
		
		add(A,A1);
	}
	else
		A[1]=2;
	for (i=A[0]; i>=1; i--)
		fprintf(out,"%d",A[i]);
	fprintf(out,"\n");
	
	fclose(in);
	fclose(out);
	return 0;
}