Cod sursa(job #34193)

Utilizator astronomyAirinei Adrian astronomy Data 20 martie 2007 12:55:41
Problema Diamant Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>

#define MAXN (1 << 17)
#define MAXV 45000
#define MOD 10000

int N, M, X;
int A[MAXN], B[MAXN], maxval;

#define A (A+MAXV)
#define B (B+MAXV)
#define rest(x,y) ((x)-(x)/(y)*(y))

int solve(void)
{
	int c = 0, i, j, val;

	A[0] = 1;
	for(i = 1; i <= N; i++)
	 for(j = 1; j <= M; j++)
	 {
		if(c % 2 == 0)
			for(val = -maxval; val <= maxval; val++)
			{
				B[val] = A[val]+A[val-i*j]+A[val+i*j];
				B[val] = rest(B[val], MOD);
			}
		else
			for(val = -maxval; val <= maxval; val++)
			{
				A[val] = B[val]+B[val-i*j]+B[val+i*j];
				A[val] = rest(A[val], MOD);
			}
	 	c++;
	 }
	if(c % 2 == 0)
		return A[X];
	else
		return B[X];
}

int main(void)
{
	freopen("diamant.in", "rt", stdin);
	freopen("diamant.out", "wt", stdout);

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

	maxval = N*(N+1)*M*(M+1)/4;

	if(X > maxval || X*(-1) > maxval)
		printf("0\n");
	else
		printf("%d\n", solve());

	return 0;
}