Cod sursa(job #36198)

Utilizator gcosminGheorghe Cosmin gcosmin Data 23 martie 2007 10:16:38
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <string.h>

#define JEG 43000
#define MOD 10000
#define RED(x) x -= (x >= MOD) ? MOD : 0;

int N, M, S;

short ant[JEG << 1];
short cur[JEG << 1];

inline int MIN(int a, int b) { return (a < b) ? a : b; }
inline int MAX(int a, int b) { return (a > b) ? a : b; }

int main()
{
	int i, j, sum, q, mins, maxs;
	
	freopen("diamant.in", "r", stdin);
	freopen("diamant.out", "w", stdout);

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

	ant[0 + JEG] = 1;
	mins = JEG;
	maxs = JEG;

	for (i = 1; i <= N; i++)
		for (j = 1; j <= M; j++) {
			sum = i * j;

			for (q = MAX(mins - sum, 0); q <= MIN(maxs + sum, JEG << 1); q++) {
				if (q - sum >= 0) cur[q] += ant[q - sum], RED(cur[q]);
				if (q + sum < (JEG << 1)) cur[q] += ant[q + sum], RED(cur[q]);
				cur[q] += ant[q], RED(cur[q]);
				if (cur[q]) {
					if (q < mins) mins = q;
					if (q > maxs) maxs = q;
				}
			}

			memcpy(ant, cur, sizeof(cur));
			memset(cur, 0, sizeof(cur));
		}

	if (-JEG >= S || S >= JEG) printf("0\n");
	else printf("%d\n", ant[S + JEG]);
	
fclose(stdin);
fclose(stdout);
return 0;
}