Cod sursa(job #2529758)

Utilizator FrostfireMagirescu Tudor Frostfire Data 23 ianuarie 2020 21:52:32
Problema Diamant Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <unordered_map>
#define VAL 44100
#define MOD 10000

using namespace std;

int sum, m, n, x, dp[2*VAL+10], dp1[2*VAL+10], dp2[2*VAL+10];

int adun(int a, int b)
{   if(a + b < 0) return a + b + VAL;
    return a + b;
}

int scad(int a, int b)
{   if(a - b < 0) return a - b + VAL;
    return a - b;
}

void rucsac(int val)
{   for(int i=sum; i>=-sum; i--) dp1[adun(i,0)] = dp[scad(i,val)];
    for(int i=-sum; i<=sum; i++) dp[adun(i,0)] = (dp[adun(i,0)] + dp1[adun(i,0)] + dp[adun(i,val)]) % MOD;
}

int main()
{
    ifstream cin("diamant.in");
    ofstream cout("diamant.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m >> x;
    if(x < 0) x = -x;
    if(x > VAL)
        {   cout << 0 << '\n';
            return 0;
        }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) sum = sum + i * j;
    dp[0] = 1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            rucsac(i*j);
    cout << dp[x] << '\n';
    return 0;
}