Cod sursa(job #2138445)

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

int n, m, x;
int dp[2][44105];
int maxim;
vector<int> p;

const int MOD = 10000;

void knapsack() {
  for (int i = 1; i <= p.size(); i++) {
    for (int j = -maxim; j <= maxim; j++) {
      int s = dp[!(i % 2)][maxim + j];

      //if (maxim + j - p[i - 1] > -(1LL << 31) + 1)
        s = (s + 1LL * dp[!(i % 2)][maxim + j - p[i - 1]]) % MOD;

      //if (maxim + j + p[i - 1] < (1LL << 31) - 1)
        s = (s + 1LL * dp[!(i % 2)][maxim + j + p[i - 1]]) % MOD;

      dp[i % 2][maxim + 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] = 1;

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

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      p.push_back(i * j);

  knapsack();

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

  return 0;
}