Cod sursa(job #235976)

Utilizator marinMari n marin Data 26 decembrie 2008 13:55:06
Problema Culori Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#define DIM 520
#define Huge char*
#define BASE 50


long c[DIM];
char a[DIM][DIM][10];
long i,j,k,n,d;



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

void AtribHuge(Huge H, Huge X) {
  int i;
  for (i = 0; i <= X[0]; ++i) {
    H[i] = X[i];
  }
}

void Add(Huge A, Huge 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(Huge A, Huge B, Huge 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;
}


int main(){
  FILE *f = fopen("culori.in","r");
  fscanf(f,"%ld",&n);
  n=2*n-1;
  for (i = 1;i<=n;i++) {
    fscanf(f,"%lld",&c[i]);
    AtribValue(a[i][i],1);
  }
  fclose(f);

  for (d = 2; d<=n; d++){
    for (i=1;i+d-1<=n;i++) {
      j = i+d-1;
      if (d%2 == 0 || c[i]!=c[j])
	AtribValue(a[i][j],0);
      else {


	for (k=i+1;k<j;k++) {
	  MultHuge(a[i+1][k],a[k+1][j],a[0][0]);
	  Add(a[i][j],a[0][0]);
//	  a[i][j]+=(a[i+1][k]*a[k+1][j]);
	}
      }
    }
  }
  FILE *g = fopen("culori.out","w");
  if (a[1][n][0]==0) fprintf(g,"0");
  else
	for (i=a[1][n][0];i>=1;i--)
		fprintf(g,"%d",a[1][n][i]);
  fclose(g);


  return 0;
}