Cod sursa(job #1194338)

Utilizator denisx304Visan Denis denisx304 Data 3 iunie 2014 15:51:16
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<algorithm>
#include <fstream>
#include <iostream>
#define mod 10000

using namespace std;

int n, m, x, suma, dp[90005], aux[90005];

int main()
{
    ifstream cin("diamant.in");
    ofstream cout("diamant.out");
    cin >> n >> m >> x;
    for (int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            suma += i * j;
    if (x < -suma || x > suma)
    {
        cout << 0;
        return 0;
    }
    dp[suma + 1] = 1;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            for (int k = 0; k < 90005; k ++)
                aux[k] = 0;
            for (int k = 1; k <= 2 * suma + 1; k ++)
            {
                if (k - i * j > 0 && dp[k - i * j])
                {
                    aux[k] += dp[k - i * j];
                    aux[k] -= (aux[k] >= mod ? mod : 0);
                }
                if (k + i * j <= 2 * suma + 1 && dp[k + i * j])
                {
                    aux[k] += dp[k + i * j];
                    aux[k] -= (aux[k] >= mod ? mod : 0);
                }
            }
            for (int k = 1; k <= 2 * suma + 1; k ++)
            {
                dp[k] += aux[k];
                dp[k] -= (dp[k] >= mod ? mod : 0);
            }
        }
    cout << dp[suma + 1 + x];
    return 0;
}