Cod sursa(job #34453)

Utilizator stef2nStefan Istrate stef2n Data 20 martie 2007 19:42:28
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <string.h>

#define infile "diamant.in"
#define outfile "diamant.out"
#define MOD 10000
#define LMAX 44105

FILE *fin,*fout;
int m,n,X;
int A[2][2*LMAX];

void update(int *A, int *B, int val)
  {
   memcpy(A,B,(2*LMAX-2)*sizeof(int));
   for(int i=-LMAX;i<=LMAX;i++)
      if(B[i+LMAX])
        {
         A[i+LMAX+val]+=B[i+LMAX];
         if(A[i+LMAX+val]>=MOD)
           A[i+LMAX+val]-=MOD;
         A[i+LMAX-val]+=B[i+LMAX];
         if(A[i+LMAX-val]>=MOD)
           A[i+LMAX-val]-=MOD;
        }
  }

int solve()
  {
   int i,j,cur=0,prec=1;
   for(i=0;i<=2*LMAX-2;i++)
      A[0][i]=0;
   A[0][LMAX]=1;
   for(i=1;i<=m;i++)
      for(j=1;j<=n;j++)
         {
          cur=!cur;
          prec=!prec;
          update(A[cur],A[prec],i*j);
         }
   return A[cur][LMAX+X];
  }


int main()
{
int extrem;
fin=fopen(infile,"r");
fscanf(fin,"%d %d %d",&m,&n,&X);
fclose(fin);
fout=fopen(outfile,"w");
extrem=m*(m+1)/2 * n*(n+1)/2;
if(X>extrem || X<-extrem)
  fprintf(fout,"0\n");
else
  fprintf(fout,"%d\n",solve());
fclose(fout);
return 0;
}