Cod sursa(job #206112)

Utilizator marinMari n marin Data 4 septembrie 2008 19:10:24
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
//4N + 2(N-1)(N-2)
#include <stdio.h>
#define BASE 10
long int n,m,p,s;
long int H[2003];
long int A[2003];
long int B[2003];
long int unu[2003];
long int C[2003];
long int L,i,aux,x;
char c;

void AtribValue(long int *H, long int X) {
  H[0] = 0;
  while (X) {
      ++H[0];
      H[H[0]] = X % BASE;
      X /= BASE;
  }
}


void Mult(long int *H,long int X)
/* H <- H*X */
{ long int i;
  long int 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) /* Cat timp exista transport */
    { H[++H[0]]=T%10;
      T/=10;
    }
}

void Subtract(long int *A, long int *B)
/* A <- A-B */
{ int i, T=0;

  for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
    /* Adica A[i]=A[i]-(B[i]+T);
       if (A[i]<0) T=1; else T=0;
       if (T) A[i]+=10; */
  while (!A[A[0]]) A[0]--;
}

void Add(long int *A, long int *B)
/* A <- A+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;
}

void MultHuge(long int *A, long int *B, long int *C)
/* C <- A x B */
{ 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 AtribHuge(long int *H, long int *X) {
  int i;
  for (i = 0; i <= X[0]; ++i) {
    H[i] = X[i];
  }
}


int main(){
  FILE *f = fopen("sarpe.in","r");
  int L = 0;
  while (!feof(f)) {
    x = fscanf(f,"%c",&c);
    if (x==-1) break;
    if (c=='\n') break;
    H[++L] = c-48;
  }
  H[0]=L;
  int ok=0;
  if (L==1 && H[1]==1)
    ok=1;
  for (i=1;i<=L/2;i++) {
    aux = H[i];
    H[i] = H[L-i+1];
    H[L-i+1] = aux;
  }
  H[0] = L;
  fclose(f);

  AtribHuge(A,H);
  Mult(A,4l);
  AtribValue(unu,1l);
  Subtract(H,unu);
  AtribHuge(B,H);
  Subtract(H,unu);
  MultHuge(B,H,C);
  Mult(C,2l);
  Add(A,C);

  FILE *g = fopen("sarpe.out","w");
  if (ok) {
    A[0]=1;
    A[1]=2;
  }
  for (int i=A[0];i>=1;i--)
    fprintf(g,"%ld",A[i]);
  fclose(g);

  return 0;
}