Cod sursa(job #2024155)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 20 septembrie 2017 00:06:03
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>
#include <algorithm>

const int MAXN = 20;
const int MAXX = 4e4 + 4e3;
const int MOD = 1e4;

int v[MAXN * MAXN], d[2][2 * MAXX];

int main() {
  int n, m, k, s, x;
  FILE *f = fopen("diamant.in", "r");
  fscanf(f, "%d%d%d", &n, &m, &x);
  fclose(f);
  f = fopen("diamant.out", "w");
  if (x + MAXX < 0 || MAXX <= x) {
    fprintf(f, "0\n");
  } else {
    k = 0;
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= m; ++j) {
        v[++k] = i * j;
      }
    }
    std::sort(v + 1, v + k + 1);
    d[0][MAXX] = 1;
    s = 0;
    for (int i = 1; i <= k; ++i) {
      s += v[i];
      int p = i % 2;
      for (int c = MAXX - s; c <= MAXX + s; ++c) {
        d[p][c] = (d[1 - p][c + v[i]] + d[1 - p][c - v[i]] + d[1 - p][c]) % MOD;
      }
    }
    fprintf(f, "%d\n", d[(n * m) % 2][MAXX + x]);
  }
  fclose(f);
  return 0;
}