Cod sursa(job #2282238)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 13 noiembrie 2018 15:15:03
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin("diamant.in");
ofstream fout("diamant.out");
 
const int MOD = 10000;
const int NMAX = 44100;

int DP[2][2 * NMAX + 50];

int main() {
    ios::sync_with_stdio(false);

    int n, m, x;
    fin >> n >> m >> x;

    int lim = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            lim += i * j;
        }
    }

    if (x < 0) x = -x;
    if (x > lim) {
        fout << 0;
        return 0;
    }

    int mx = 2 * lim;

    DP[0][lim] = 1;
    int now = 1, prev = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            int val = i * j;
            for (int k = 0; k <= mx; ++k) {
                DP[now][k] = DP[prev][k];
            }
            for (int k = 0; k + val <= mx; ++k) {
                DP[now][k] = (DP[now][k] + DP[prev][k + val]);
                if (DP[now][k] >= MOD) {
                    DP[now][k] -= MOD;
                }
            }
            for (int k = val; k <= mx; ++k) {
                DP[now][k] = (DP[now][k] + DP[prev][k - val]);
                if (DP[now][k] >= MOD) {
                    DP[now][k] -= MOD;
                }
            }
            now = 1 - now;
            prev = 1 - prev;
        }
    }

    fout << DP[1 - now][lim + x];
    return 0;
}