Cod sursa(job #45435)

Utilizator devilkindSavin Tiberiu devilkind Data 1 aprilie 2007 15:14:43
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <string.h>
#define XMAX 50000

FILE *f = fopen("diamant.in","rt"), *g = fopen("diamant.out","wt");

long int oldp[XMAX],oldn[XMAX],noup[XMAX],noun[XMAX];
long int i,j,k,n,m,x,max;


long int old(long int x)
{
if (x<0) return oldn[-x];
return oldp[x];
}

#define ls -44200
#define ld 44200

int main()
{
long int min,max;
fscanf(f,"%ld %ld %ld",&n,&m,&x);
k=0;
oldp[0]=1;
min=0;
max=0;
if ((x>45000)||(-x>45000)) {fprintf(g,"0\n");return 0;}
for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
        {
        for (k=min-i*j;k<=max+i*j;k++)
		 if (k>=0) {noup[k]=old(k-i*j)+old(k)+old(k+i*j);
                   noup[k]%=10000;
                   if ((noup[k])&&(k>max)) max=k;
                   }
		   else {noun[-k]=old(k-i*j)+old(k)+old(k+i*j);noun[-k]%=10000;
                if ((noun[-k])&&(k<min)) min=k;
                }
        memcpy(oldp,noup,sizeof(oldp));
        memcpy(oldn,noun,sizeof(oldp));
        }
if (x<0) fprintf(g,"%ld\n",noun[-x]);
    else fprintf(g,"%ld\n",noup[x]);
fclose(f);
fclose(g);
return 0;
}