Cod sursa(job #34403)

Utilizator victorsbVictor Rusu victorsb Data 20 martie 2007 18:41:00
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <string.h>

#define Nmax 21
#define Smax 44105
#define abs(x) (x)>=0?(x):-(x)

const int modul = 10000;
int n, m, x;
int d1[Smax], d2[Smax];

void citire()
{
    scanf("%d %d %d\n", &n, &m, &x);
}

void solve()
{
    int i, j, sum;
    d2[0] = 1;
    for (i=1; i<=n; ++i)
        for (j=1; j<=m; ++j)
        {
            memcpy(d1, d2, sizeof(d1));
            memset(d2, 0, sizeof(d2));
            for (sum = - Smax + 1; sum < Smax; ++sum)
            {
                if (sum - i*j >= 0)
                {
                    d2[sum - i*j] += d1[abs(sum)];
                    if (d2[sum - i*j] >= modul)
                        d2[sum - i*j] -= modul;
                }
                if (sum >= 0)
                {
                    d2[sum] += d1[sum];
                    if (d2[sum] >= modul)
                        d2[sum] -= modul;
                }
                if (sum + i*j >= 0)
                {
                    d2[sum + i*j] += d1[abs(sum)];
                    if (d2[sum + i*j] >= modul)
                        d2[sum + i*j] -= modul;
                }
            }
        }
    sum = abs(x);
    if (sum < Smax)
        printf("%d\n", d2[sum]);
    else
        printf("0\n");
}

int main()
{
    freopen("diamant.in", "r", stdin);
    freopen("diamant.out", "w", stdout);
    citire();
    solve();
    return 0;
}