Cod sursa(job #2138465)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 21 februarie 2018 17:46:26
Problema Diamant Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, x;
int dp[2][2 * 44105];
int maxim;

const int MOD = 10000;

void knapsack() {
  int i = 1;
  for (int i2 = 1; i2 <= n; i2++) {
    for (int j2 = 1; j2 <= m; j2++) {
      int y = i2 * j2;
      for (int j = -maxim; j <= maxim; j++) {
        int s =  dp[!(i & 1)][maxim + j];
        s = (s +  dp[!(i & 1)][maxim + j - y]) % MOD;
        s = (s +  dp[!(i & 1)][maxim + j + y]) % MOD;
        dp[i & 1][maxim + j] = s;
      }
      i++;
    }
  }
}

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] = 1;

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

  knapsack();

  printf("%d\n", dp[((n * m) & 1)][maxim + x]);

  return 0;
}