Cod sursa(job #3266003)

Utilizator AlexPlesescuAlexPlesescu AlexPlesescu Data 4 ianuarie 2025 23:06:07
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;
#define pb push_back
#define sz(x) (int)(x.size())
#define all(a) a.begin(), a.end()
#define nl '\n'
const int N = 2e5 + 5, INF = 1e9, VALMAX = 44100, VALMIN = -44100, val = 60000, mod = 10000;

int n, m, x, dp[2][N + 5];

int adun(int n) {
    n += val;
    return n;
}

/// dp[i] = numarul de diamante de calitate i (-20000 <= i <= 200000)
/// dp[i] += 
/// trb sa tin dp[coloana][suma] fiindca s ar putea sa updatez rucsacu gresit sa contribuie sume la (i, j, g) din (i, j, g)

int main() {
    freopen("diamant.in", "r", stdin);
    freopen("diamant.out", "w", stdout);
    cin >> n >> m >> x;
    dp[0][adun(0)] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            for (int g = -50000; g <= 50000; g++) {
                dp[1][adun(g)] = (dp[0][adun(g)] + dp[0][adun(g - i * j)] + dp[0][adun(g + i * j)]) % mod;
            }
            for (int g = -50000; g <= 50000; g++) {
                dp[0][adun(g)] = dp[1][adun(g)];
                dp[1][adun(g)] = 0;
            }
        }
    }
    if (x >= 0 && x > VALMAX) {
        cout << 0;
        return 0;
    }
    else if (x < 0 && x < VALMIN) {
        cout << 0;
        return 0;
    }
    cout << dp[0][adun(x)];
}