Cod sursa(job #34320)

Utilizator dominoMircea Pasoi domino Data 20 martie 2007 17:21:33
Problema Diamant Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <stdio.h>
#include <string.h>

#define MAX_S 90005
#define MOD 10000
#define FIN "diamant.in"
#define FOUT "diamant.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define SHIFT 45000

int N, M, X, A[MAX_S], B[MAX_S];

int main(void)
{
    int i, j, k, t, sum = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %d", &N, &M, &X);

    FOR (i, 1, N+1) FOR (j, 1, M+1) sum += i*j;
    if (X < -sum || X > sum) { printf("0\n"); return 0; }

    A[SHIFT] = B[SHIFT] = 1; sum = 0;
    FOR (i, 1, N+1) FOR (j, 1, M+1)
    {
        t = i*j; sum += t;
        for (k = sum+SHIFT; k >= -sum+SHIFT; k--)
        {
            if (k-t >= 0) B[k] += A[k-t];
            if (k+t < MAX_S) B[k] += A[k+t];
            while (B[k] >= MOD) B[k] -= MOD;
        }
        memcpy(A, B, sizeof(B));
    }

    printf("%d\n", A[X+SHIFT]);

    return 0;
}