Pagini recente » Cod sursa (job #632258) | Cod sursa (job #2055217) | Cod sursa (job #1866714) | Cod sursa (job #235976)
Cod sursa(job #235976)
#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;
}