Cod sursa(job #2282224)

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

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;
    vector < int > DP[2];
    for (auto &x: DP) x.resize(mx + 5);

    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];
                if (k + val <= mx) {
                    DP[now][k] = (DP[now][k] + DP[prev][k + val]) % MOD;
                }
                if (k - val >= 0) {
                    DP[now][k] = (DP[now][k] + DP[prev][k - val]) % MOD;
                }
            }
            now = 1 - now;
            prev = 1 - prev;
        }
    }

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