Cod sursa(job #2691744)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 29 decembrie 2020 19:42:55
Problema Diamant Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>

using namespace std;

const int MOD = 1e4;
const int BASE = 210 * 210;
const int N = 2 * BASE + 1;

int dp[N], aux[N];

int main() {
    ifstream in("diamant.in");
    ofstream out("diamant.out");

    int nl, nc, x, minq, maxq, mini, maxi;
    in >> nl >> nc >> x;
    minq = maxq = mini = maxi = BASE;
    dp[BASE] = 1;
    for (int i = 1; i <= nl; ++i)
        for (int j = 1; j <= nc; ++j) {
            for (int k = maxq; k >= minq; --k)
                if (dp[k]) {
                    aux[k + i * j] += dp[k];
                    maxi = max(maxi, k + i * j);
                }
            for (int k = minq; k <= maxq; ++k)
                if (dp[k]) {
                    aux[k - i * j] += dp[k];
                    mini = min(mini, k - i * j);
                }
            for (int k = mini; k <= maxi; ++k) {
                dp[k] += aux[k];
                aux[k] = 0;
                if (dp[k] >= MOD)
                    dp[k] -= MOD;
            }
            minq = mini, maxq = maxi;
        }
    if (x >= -BASE && x <= BASE)
        out << dp[BASE + x];
    else
        out << 0;

    in.close();
    out.close(); 
    return 0;
}