Cod sursa(job #2032722)

Utilizator lucametehauDart Monkey lucametehau Data 5 octombrie 2017 17:06:42
Problema Diamant Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>

using namespace std;
ifstream cin("diamant.in");
ofstream cout("diamant.out");

const int MOD = 10000;
const int N_MAX = 20;
const int M_MAX = 20;
const int L_MAX = 2;
const int S_MAX = 100000;
const int V_MAX = 44101;

int n, m, k;
int nr;
int st, dr;
int sum;
int i1, i2;

int v[N_MAX * M_MAX + 1];
int dp[L_MAX][S_MAX];

int main()
{
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
        {
            v[++nr] = i * j;
            st -= i * j;
        }
    dr = -st;
    st += V_MAX; dr += V_MAX;
    if(st > k + V_MAX || dr < k + V_MAX)
    {
        cout << 0;
        return 0;
    }
    dp[0][V_MAX] = 1;
    for(int i = 1; i <= nr; i++)
    {
        sum += v[i];
        for(int j = V_MAX - sum; j <= V_MAX + sum; j++)
        {
            i1 = !(i & 1); i2 = (i & 1);
            dp[i2][j] = (dp[i1][j] + dp[i1][j - v[i]] + dp[i1][j + v[i]]) % MOD;
        }
    }
    cout << dp[nr & 1][k + V_MAX];
    return 0;
}