Cod sursa(job #38712)

Utilizator vlad_popaVlad Popa vlad_popa Data 25 martie 2007 23:56:25
Problema Diamant Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>

#define FIN "diamant.in"
#define FOUT "diamant.out"
#define NMAX 1<<16

int s1[NMAX], s2[NMAX];
int N, M, X;

void read ()
{
  scanf ("%d%d%d", &N, &M, &X);
}

void solve ()
{
  int i, j, lim;
  
  s1[1] = s1[0] = 1;

  if (X < 0)
    X = -X;

  lim = ((N*M+1)*(N*M+1)*N*N*M*M)/4;
  if (X > lim)
   {
     printf ("0\n");
     return;
   }

  for (int p = 1; p < N*M; ++ p)
   {
     for (int x = 0; x <= lim; ++ x)
      {
        i = p / M + 1;
        j = p % M + 1;
        if (x - i*j > 0)
          s2[x] = s1[x - i*j] + s1[x + i*j] + s1[x];
        else
          s2[x] = s1[i*j - x] + s1[x + i*j] + s1[x];
        s2[x] %= 10000;
      }

     for (int x = 0; x <= lim; ++ x)
       s1[x] = s2[x];
   }

  printf ("%d\n", s1[X]);
}

int
 main ()
{
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);

  read ();
  solve ();
  
  return 0;
}