Cod sursa(job #1805832)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 14 noiembrie 2016 15:02:47
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

const int NMAX = 20;
const int MMAX = NMAX;
const int MOD = 10000;

int dp[2][100000];

int sz;
int vals[NMAX * MMAX];

int mod[3 * 10000];

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

    for (int i = 0; i < 10000; ++ i)
        mod[i] = i;
    for (int i = 10000; i < 30000; ++ i)
        mod[i] = mod[i - 10000];

    int n, m, x;
    cin >> n >> m >> x;

    for (int i = 1; i <= n; ++ i)
        for (int j = 1; j <= m; ++ j)
            vals[++ sz] = i * j;

    sort(vals + 1, vals + sz + 1);

    dp[0][50000] = 1;
    int sum = 0;
    for (int i = 1; i <= sz; ++ i) {
        memset(dp[i & 1], 0, sizeof(dp[i & 1]));

        sum += vals[i];
        for (int j = 50000 - sum; j <= 50000 + sum; ++ j)
            dp[i & 1][j] = mod[dp[(i & 1) ^ 1][j] + dp[(i & 1) ^ 1][j - vals[i]] + dp[(i & 1) ^ 1][j + vals[i]]];
    }

    if (x < -45000 || x > 45000)
        cout << "0\n";
    else
        cout << dp[sz & 1][x + 50000];

    cin.close();
    cout.close();
    return 0;
}