Cod sursa(job #1089951)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 22 ianuarie 2014 08:39:37
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <iostream>
#include <cstring>

#define mod 10000

using namespace std;

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

int dp[2][100010];
int v[410];
int n,m,x,t;

int main()
{
    fin>>n>>m>>x;

    for (int i=1; i<=n; ++i)
        for (int j=1; j<=m; ++j)
    {
        v[++t] = i*j;
    }

    dp[0][50000] = 1;
    dp[1][50000] = 1;

    int minv = 0, maxv = 0;

    int ok=0;

    for (int i=1; i <= t; ++i, ok = 1-ok)
    {
        int *p1 = dp[ok] + 50000;
        int *p2 = dp[1-ok] + 50000;

        for (int j=minv; j<=maxv; ++j)
        {
            if (p1[j])
            {
                p2[j+v[i]] += p1[j];
                if (p2[j+v[i]] >= mod)
                    p2[j+v[i]] -= mod;
                p2[j-v[i]] += p1[j];
                if (p2[j-v[i]] >= mod)
                    p2[j-v[i]] -= mod;
            }
        }

        maxv += v[i];
        minv -= v[i];

        memcpy (dp[ok],dp[1-ok],sizeof(dp[ok]));
    }

    int *p = dp[ok] + 50000;

    if (x >44100 ||  x < -44100)
        fout<<0;
    else fout<<p[x];
}