Cod sursa(job #2895694)

Utilizator AlexMariMarinescu Alexandru AlexMari Data 29 aprilie 2022 13:18:25
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("diamant.in");
ofstream fout("diamant.out");

#define MOD 10000

int n, m, s, sum_max, dp[200005];

int aux[200005];

int main()
{
    fin >> n >> m >> s;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            sum_max += i * j;
    if (s > sum_max || s < -sum_max) {
        fout << -0;
        return 0;
    }

    dp[2 * sum_max] = 1;
    int max_val = 2 * sum_max, min_val = 2 * sum_max, copie_min_val = 2 * sum_max;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            for (int k = max_val; k >= copie_min_val; k--) {
                if (dp[k]) {
                    aux[k - 2 * i *j] += dp[k];
                    aux[k - 2 * i * j] %= MOD;
                    min_val = min(min_val, k - 2 * i * j);
                    aux[k - i * j] += dp[k];
                    aux[k - i * j] %= MOD;
                    min_val = min(min_val, k - i * j);
                }
            }
            for (int k = max_val; k >= min_val; k--) {
                dp[k] += aux[k];
                dp[k] %= MOD;
                aux[k] = 0;
            }
            copie_min_val = min_val;
        }
    fout << dp[sum_max + s];
    return 0;
}