Cod sursa(job #3250417)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 20 octombrie 2024 19:20:59
Problema Diamant Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <vector>
//#include <bits/stdc++.h>
#define in fin
#define out fout
#define mod 10000

using namespace std;

ifstream fin("diamant.in");
ofstream fout("diamant.out");

int dp[801][88201];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m, x; in >> n >> m >> x;
    vector<int> c;
    // avem la fiecare 2 cazuri : ignore (0), 1 sau -1

    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            c.push_back( (i * j * 1) % mod );
            c.push_back( (i * j * (-1)) % mod );
        }
    }

    int offs = (m * (m + 1)) / 2 * (n * (n + 1)) / 2;
    c.insert(c.begin(), 0);

    // cout << "v : ";
    // for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
    // cout << '\n';

    dp[0][offs] = 1; // 44100 e offsetu de la 0
    for(int i = 1; i <= 2 * n * m; i++){
        for(int j = 0; j <= offs * 2; j++){
            dp[i][j] += dp[i - 1][j];
            dp[i][j] %= mod;
            if(j - c[i] >= 0 && j - c[i] <= offs * 2 && c[i] > 0) dp[i][j] += dp[i - 1][j - c[i]];
            else if(j - c[i] >= 0 && j - c[i] <= offs * 2 && c[i] < 0) dp[i][j] += dp[i - 2][j - c[i]];
            dp[i][j] %= mod;
        }
    }

    // cout << "offset = " << offs << '\n';
    // cout << dp[8][9] << '\n';

    out << dp[n * m * 2][offs + x];

    return 0;
}