Cod sursa(job #3178769)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 2 decembrie 2023 14:03:24
Problema Diamant Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

const int mod = 1e4;

int n, m, x;
vector <vector <int> > dp;

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("diamant.in", "r", stdin);
    freopen("diamant.out", "w", stdout);

    cin >> n >> m >> x;
    int maxVal = n  * (n + 1) * m  * (m + 1) / 4;
//    if(abs(x) > maxVal)
//    {
//        cout << 0;
//        return 0;
//    }

    dp.resize(2, vector <int> (2 * maxVal  + 1));

    dp[1][maxVal + 1] = 1;
    dp[1][maxVal + 0] = 1;
    dp[1][maxVal - 1] = 1;

    int ind1 = 0, ind2 = 1;
    for(int i = 2; i <= n * m; i ++)
    {
        ind1 = 1 - ind1;
        ind2 = 1 - ind2;

        for(int j = 0; j <= 2 * maxVal; j ++)
        {
            dp[ind2][j] = 0;
            int lin = (i / m  + i % m), col = i % m;
            if(!col)
                col = m;
            int nr = lin * col;
            if(j >= nr)
            {
                dp[ind2][j] += dp[ind1][j - nr];
                if(dp[ind2][j] >= mod)
                    dp[ind2][j] -= mod;
            }
            if(j + nr <= 2 * maxVal)
            {
                dp[ind2][j] += dp[ind1][j + nr];
                if(dp[ind2][j] >= mod)
                    dp[ind2][j] -= mod;
            }

            dp[ind2][j] += dp[ind1][j];
            if(dp[ind2][j] >= mod)
                dp[ind2][j] -= mod;
        }
    }

    cout << dp[ind2][maxVal + x];
    return 0;
}