Cod sursa(job #51900)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 16 aprilie 2007 23:44:28
Problema Diamant Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
#define fin  "diamant.in"
#define fout "diamant.out"
#define Smax 99226
#define Mod  10000

int s1[2*Smax]={0},s2[2*Smax]={0};
int N,M,X;

int main() {
int i,j;
register int k,val;

	freopen(fin,"r",stdin); freopen(fout,"w",stdout);
	
	scanf("%d%d%d",&N,&M,&X);

	s1[Smax]=1;

	for (i=1;i<=N;++i)
		for (j=1;j<=M;++j) {
			val=i*j;
			for (k=-Smax;k<Smax;++k)
				if (k-val>-Smax && s1[k-val+Smax]) {
					s2[k+Smax]=s2[k+Smax]+s1[k-val+Smax];
					if (s2[k+Smax]>=Mod)
						s2[k+Smax]-=Mod;
				}

			val*=-1;
			
			for (k=-Smax;k<Smax;++k) 
				if (k-val<Smax && s1[k-val+Smax]) {
					s2[k+Smax]+=s1[k-val+Smax];
					if (s2[k+Smax]>=Mod)
						s2[k+Smax]-=Mod;
				}
			
			for (k=-Smax;k<Smax;++k) {
				s1[k+Smax]+=s2[k+Smax];
				if (s1[k+Smax]>=Mod)
					s1[k+Smax]-=Mod;
				s2[k+Smax]=0;
			}
		}

	if (X<=-Smax || X>=Smax)
		printf("0\n");
	else
		printf("%d\n",s1[X+Smax]);

	fclose(stdin); fclose(stdout);

	return 0;
		
}