Cod sursa(job #120815)

Utilizator juniorOvidiu Rosca junior Data 6 ianuarie 2008 18:41:56
Problema Diamant Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
// 40 p -> 4 TLE + Incorect + Killed (memorie depasita)

#include <stdio.h>
#include <string.h>

short a[90001], b[90001];
int l, c, z, nl, nc, x, va, vb, ln, lp, n, p;

int main () {
  freopen("diamant.in" ,"r",stdin);
  freopen("diamant.out","w",stdout);
  scanf("%d %d %d", &nl, &nc, &x);
  a[45000] = 1;
  ln = 45000; lp = 45000; // limita "negativa" si limita "pozitiva"
  for (l = 1; l <= nl; l++) {
    for (c = 1; c <= nc; c++) {
      memcpy(b, a, sizeof(a));
      memset(a, 0, sizeof(a));
      for (vb = ln; vb <= lp; vb++) {
        n = vb-l*c; // pentru valorile "negative"
        a[n] += b[vb];
        if (a[n] >= 10000)
          a[n] -= 10000;
        a[vb] += b[vb];
        if (a[vb] >= 10000)
          a[vb] -= 10000;
        p = vb+l*c; // pentru valorile "pozitive"
        a[p] += b[vb];
        if (a[p] >= 10000)
          a[p] -= 10000;
      }
      ln -= l*c; lp += l*c;
    }
  }
  printf("%d", a[x+45000]);
  return 0;
}


/*

[1] Valorile din b contribuie la aparitia anumitor valori in a.

1,1
       -1  0  1
        1  1  1

1,2
 -3 -2 -1  0  1  2  3
  0  0  0  0  1  1  1
  0  0  1  1  2  1  1
  1  1  2  1  2  1  1

2,1
 -3 -2 -1  0  1  2  3
  1  1  2  1  2  1  1
*/