Cod sursa(job #421061)

Utilizator pykhNeagoe Alexandru pykh Data 21 martie 2010 00:54:46
Problema Sarpe Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<stdio.h>
#include<string.h>
const char in[]="sarpe.in", out[]="sarpe.out";
const long long N = 1<<10;
typedef int huge[N];
huge rez, n, a, b;
char s[N];

void mult(huge & H, unsigned long X)
{int i, T=0;
  for ( i = 1 ; i <= H[ 0 ] ; i++ )
    { H[ i ] = H[ i ] * X + T ;
      T = H[ i ] / 10 ;
      H[ i ]=H[ i ] % 10 ;
    }
  while (T) 
    { H[ ++H[ 0 ] ] = T % 10;
      T /= 10;
    }
}

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

void multi(huge a, huge b, huge& c)
{ int i,j,T=0;
  c[ 0 ] = a[ 0 ] + b[ 0 ] - 1;
  for (i=1;i<=a[0]+b[0];) c[i++]=0;
  for (i=1;i<=a[0];i++)
    for (j=1;j<=b[0];j++)
      c[i+j-1]+=a[i]*b[j];
  for (i=1;i<=c[0];i++)
    { T=(c[i]+=T)/10;
      c[i]%=10;
    }
  if (T) c[++c[0]]=T;
}

	
void sum(huge &a, huge b)
{ int i,T=0;

  if (b[0]>a[0])
    { for (i=a[0]+1;i<=b[0];) a[i++]=0;
      a[0]=b[0];
    }
    else for (i=b[0]+1;i<=a[0];) b[i++]=0;
  for (i=1;i<=a[0];i++)
    { a[i]+=b[i]+T;
      T=a[i]/10;
      a[i]%=10;
    }
  if (T) a[++a[0]]=T;
}

int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		fgets(s, N, stdin);
		int i, t=0;
		for(i = strlen(s)  ; i >= 0 ; --i)
			if(s[ i ] >= '0' && s[ i ] <= '9')n[++n[0]] = s[ i ] - '0';
		if(n[1] == n[0] == 1){printf("0\n");return 0;} 
		for(i = 0 ; i <= n[ 0 ] ; ++i)rez[i] = a[i] = b[i] = n[i];
		mult(rez, 4);
		n[0] = n[ 1 ] = 1;
		scad(b, n);
		n[ 0 ] = 1;
		n[ 1 ] = 2;
		scad(a, n);
		multi(a, b, n);
		mult(n, 2);
		sum(rez, n);
		for(int i = rez[0] ; i >= 1 ; --i)
			printf("%d",rez[i]);
		return 0;
}