Cod sursa(job #38877)

Utilizator vlad_popaVlad Popa vlad_popa Data 26 martie 2007 10:51:21
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 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 = M * (M + 1) * N * (N + 1) / 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];
        if (s2[x] > 10000)
          s2[x] -= 10000;
        if (s2[x] > 10000)
          s2[x] -= 10000;  
      }

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

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

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

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