Cod sursa(job #2300456)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 11 decembrie 2018 14:19:32
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

ifstream f ("diamant.in");
ofstream g ("diamant.out");

const int MOD = 10000;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
#ifdef LOCAL_DEFINE
    freopen (".in", "r", stdin);
#endif
    int n, m, x;
    f >> n >> m >> x;
    int sum = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            sum += i * j;
        }
    }

    if (x > sum || x < -sum) {
        g << "0\n";
        f.close(); g.close(); return 0;
    }

    int now = 1, old = 0;
    vector <vector <short>> dp(2, vector <short> (2 * sum + 5, 0));
    dp[old][sum] = 1;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            for (int s = 0;s <= 2 * sum; ++s) {
                dp[now][s] = dp[old][s];
                if (s + i * j <= 2 * sum) {
                    dp[now][s] += dp[old][s + i * j];
                }
                if (s - i * j >= 0) {
                    dp[now][s] += dp[old][s - i * j];
                }
                dp[now][s] %= MOD;
            }
            swap (now, old);
        }
    }

    g << dp[old][x + sum] << '\n';

    f.close();
    g.close();
    return 0;
}