Pagini recente » Cod sursa (job #631459) | Cod sursa (job #2720155) | Cod sursa (job #592681) | Cod sursa (job #2851000) | Cod sursa (job #34338)
Cod sursa(job #34338)
#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]);
}