Cod sursa(job #187662)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 4 mai 2008 23:55:31
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int rez[11000],v[11000],ax2[11000],ax3[11000];
char cit[11000],*s; 
void mul(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 Mul(int A[], int B[])
{
    int i, j, t, C[11000];
    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 scan()
{
	freopen("sarpe.in", "r",stdin);
	freopen("sarpe.out", "w",stdout);
	gets(cit);    
    s=cit;
	v[0]=strlen(s);
	for(int i=1;i<=v[0];++i)
		v[v[0]+1-i]=s[i-1]-'0';
}
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 solve()
{
	ax2[0]=ax3[0]=1;
	ax2[1]=2;
	ax3[1]=1;
	for(int i=0;i<=v[0];++i)
		rez[i]=v[i];
	mul(rez,4);
	sub(v,ax3);
	Mul(ax2,v);
	sub(v,ax3);
	Mul(ax2,v);
	add(ax2,rez);
	for(int i=rez[0];i>=1;--i)
		printf("%d", rez[i]);
	//4N + 2(N-1)(N-2)
}
int main()
{
	scan();
	solve();
	return 0;
}