Cod sursa(job #34338)

Utilizator filipbFilip Cristian Buruiana filipb Data 20 martie 2007 17:39:04
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <string.h>
#define aduna(x, y) (((x += y) >= MOD) ? (x -= MOD) : 0)
#define MOD 10000
#define NMax 55000

int H = 0, M, N, X, P[450], SMAX;
int D[2][NMax];

int main(void)
{
    int i, j, crt, prev;
    
    freopen("diamant.in", "r", stdin);
    freopen("diamant.out", "w", stdout);
    
    scanf("%d %d %d", &M, &N, &X);
    for (i = 1; i <= M; i++)
        for (j = 1; j <= N; j++)
            P[++H] = i * j;
    
    SMAX = M * (M+1) * N * (N+1) / 4;
    
    if (X > SMAX || X < -SMAX) { printf("0\n"); return 0; }
    
    D[0][0] = 1;
    for (i = 1; i <= H; i++)
    {
        crt = (i & 1); prev = (!crt);
        memset(D[crt], 0, sizeof(D[crt]));
        
        for (j = 0; j <= SMAX; j++)
        {
            D[crt][j] = D[prev][j];
            if (j + P[i] <= SMAX) aduna(D[crt][j], D[prev][j + P[i]]);
            
            if (j >= P[i]) aduna(D[crt][j], D[prev][j - P[i]]);
            else aduna(D[crt][j], D[prev][P[i] - j]);            
        }
        
        
    }
    
    if (X < 0) X = -X;
    
    printf("%d\n", D[crt][X]);
}