Cod sursa(job #2895690)

Utilizator AlexMariMarinescu Alexandru AlexMari Data 29 aprilie 2022 13:09:25
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 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[sum_max] = 1;
    int max_val = sum_max, min_val = sum_max, copie_min_val = sum_max, copie_max_val = sum_max;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            for (int k = copie_max_val; k >= copie_min_val; k--) {
                if (dp[k]) {
                    aux[k + i * j] += dp[k];
                    aux[k + i * j] %= MOD;
                    max_val = max(max_val, k + i * j);
                    aux[k - i * j] += dp[k];
                    aux[k - i * j] %= MOD;
                    min_val = min(min_val, k - i * j);
                }
            }

            for (int k = min_val; k <= max_val; k++) {
                dp[k] += aux[k];
                dp[k] %= MOD;
                aux[k] = 0;
            }
            copie_max_val = max_val;
            copie_min_val = min_val;
        }
    fout << dp[sum_max + s];
    return 0;
}