Cod sursa(job #2139338)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 22 februarie 2018 13:56:46
Problema Diamant Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD = 10000;
const int MAXIM = 2 * 44105;

int n, m, x;
int dp[2][MAXIM + 10];
int obj[MAXIM + 10];
int maxim;

void knapsack() {
  int i = 1;
  for (int k = 1; k <= n * m; k++, i ^= 1) {
    int y = obj[k];
    for (int j = 0; j <= MAXIM; j++) {
      int s =  dp[i ^ 1][j];

      if (maxim + j - y >= 0)
        s = (s +  dp[i ^ 1][j - y]) % MOD;

      if (maxim + j + y <= MAXIM)
        s = (s +  dp[i ^ 1][j + y]) % MOD;

      dp[i][j] = s;
    }
  }
}

int main() {
  freopen("diamant.in", "r", stdin);
  freopen("diamant.out", "w", stdout);

  scanf("%d %d %d ", &n, &m, &x);

  maxim = (n * (n + 1) / 2) * (m * (m + 1) / 2);
  dp[0][MAXIM / 2] = 1;

  if (x > maxim || x < -maxim) {
    printf("0\n");
    return 0;
  }

  int p = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      obj[++p] = i * j;

  knapsack();
  printf("%d\n", dp[((n * m) & 1)][x + MAXIM / 2]);

  return 0;
}