Cod sursa(job #2966197)

Utilizator Luka77Anastase Luca George Luka77 Data 16 ianuarie 2023 20:32:05
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX = 405, MOD = 10000, DPMAX = 90000;
int n, m, x;
int calc[NMAX];
int dp1[DPMAX], dp2[DPMAX];

inline void solve()
{
    //x = abs(x);
    if(x < 0)
        x*=-1;
    int itr = 1, sum = 0;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++ j)
        {
            sum += i * j;
            calc[itr++] = i * j;
        }
    }
    itr--;
    if(x == sum)
    {
        fout << 1;
        return;
    }
    if(sum < x)
    {
        fout << 0;
        return;
    }
    dp1[sum] = 1;
    for(int i = 1; i <= itr; ++ i)
    {
        for(int j = 1; j <= 2*sum; ++ j)
            dp2[j] = dp1[j];
        for(int j = 0; j <= 2*sum; ++ j)
        {
            if(j - calc[i] >= 0)
                dp1[j] += dp2[j-calc[i]];
            if(j + calc[i] <= 2*sum)
                dp1[j] += dp2[j+calc[i]];
            dp1[j]%=MOD;
            //dp[i][j] += (dp[i-1][j]%MOD + dp[i-1][abs(calc[i] - j)]%MOD)%MOD;
        }
    }
    fout << dp1[x + sum];
}

int main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    fin >> n >> m >> x;

    solve();
}