Cod sursa(job #267351)

Utilizator FlorianFlorian Marcu Florian Data 27 februarie 2009 08:36:43
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<string.h>
#define Mod 10000
#define Nmax 50003
FILE*f=fopen("diamant.in","r");
FILE*g=fopen("diamant.out","w");
int u[Nmax], viz1[Nmax], viz2[Nmax];
int nr[Nmax],n,m,s;
int a[405];
int k;
void read()
 {
  fscanf(f,"%d%d%d",&n,&m,&s);
  int i,j;
  for(i=1;i<=n;++i)
   for(j=1;j<=m;++j) a[++k] = i*j;
  }
void dinamica()
 {
  int i,j;
  u[0]=1;
  nr[0]=1;
  for(i=1;i<=k;++i)
   {
    memset(viz1,0,sizeof(viz1));
    memset(viz2,0,sizeof(viz2));
    for(j=0;j<=Nmax;++j)

      if(u[j]==1)
       {
	 if(a[i] + j < Nmax && !viz1[j])
	  {
	   viz1[a[i]+j]=1;
	   if(u[j+a[i]]) nr[j+a[i]]=(nr[j+a[i]] + nr[j])%Mod;
	   else nr[j+a[i]]=nr[j];
	   u[j+a[i]] = 1;
	  }
	 if(j-a[i]>=0 && !viz2[j])
	  {
	   viz2[j-a[i]] = 1;
	   if(u[j-a[i]]==1) nr[j-a[i]] = (nr[j-a[i]] + nr[j])%Mod;
	   else nr[j-a[i]] = nr[j];
	   u[j-a[i]] = 1;
	  }
       }
   }
 }
int main()
 {
  read();
  dinamica();
  if(s<0) s=-s;
  if(s>=Nmax) fprintf(g,"0\n");
  else fprintf(g,"%d\n",nr[s]);
  return 0;
  }