Cod sursa(job #2282303)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 13 noiembrie 2018 16:39:34
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin("diamant.in");
ofstream fout("diamant.out");
 
const int MOD = 10000;
 
int main() {
    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];
            }
            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;
}