Cod sursa(job #35276)

Utilizator azotlichidAdrian Vladu azotlichid Data 21 martie 2007 22:50:20
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define MAXN   44105
#define MODULO 10000
#define ABS(x) ((x) >= 0 ? (x) : -(x))

int N, M, X, i, j, k;
int p[MAXN], np[MAXN];

int main(void)
{
   freopen("diamant.in", "r", stdin);
   freopen("diamant.out", "w", stdout);
   scanf("%d %d %d", &N, &M, &X);

   if (ABS(X) > M * (M + 1) * N * (N + 1) / 4)
   {
       printf("0\n"); return 0;
   }
    memset(p, 0, sizeof(p));
    p[0] = 1;
    
    for (i = 1; i <= N; i ++)
    for (j = 1; j <= M; j ++)
    {
        memcpy(np, p, sizeof(p));
        (np[i * j] += p[0]) %= MODULO;
        for (k = 1; k < MAXN; k ++)
            if (p[k])
            {
                (np[k + i * j] += p[k]) %= MODULO;
                if (k >= i * j)
                    (np[k - i * j] += p[k]) %= MODULO;
                if (i * j - k >= 0)
                    (np[i * j - k] += p[k]) %= MODULO;
            }
            memcpy(p, np, sizeof(np));
    }

    printf("%d\n", p[ABS(X)]);
    return 0;
}