Cod sursa(job #1995361)

Utilizator DjokValeriu Motroi Djok Data 27 iunie 2017 21:01:50
Problema Diamant Scor 20
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 0.96 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
const int MAGIC = N / 2;
const int MOD = 1e4;

int i, j, n, m, dp[2][N], sum, a[405], nr, row; 
long long need;

void add(int row, int to, int from) {
  if(to >= N || to < 0) return;

  dp[row][to] += dp[1 - row][from];
  if(dp[row][to] >= MOD) dp[row][to] -= MOD;
}

int main() {
  ifstream cin("diamant.in");
  ofstream cout("diamant.out");
  ios_base::sync_with_stdio(0);

  cin >> n >> m >> need;

  for(i = 1; i <= n; ++i)
    for(j = 1; j <= m; ++j)
      a[++nr] = i * j, sum += a[nr];

  if(need > sum || need < -sum) return cout << "0\n", 0;

  dp[0][MAGIC] = 1; sum = 0;
 
  for(row = i = 1; i <= nr; ++i, row ^= 1) {
    sum += a[i];
    for(j = MAGIC - sum - 5; j < MAGIC + sum + 5; ++j) {
      dp[row][j] = dp[1 - row][j];
      add(row, j + a[i], j);
      add(row, j - a[i], j);
    }
  }

  cout << dp[1 - row][MAGIC + need] << '\n';

  return 0;
}