Cod sursa(job #752344)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 28 mai 2012 13:50:09
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<stdio.h>

FILE*f=fopen("diamant.in","r");
FILE*g=fopen("diamant.out","w");

const int mod = 10000;
int n,m,S,A[90000],B[90000],maxs,sol;
int *D1 = A + 45000,*D2 = B + 45000;

inline void solve () {
	if ( S < 0 )	S = -S;
	
	int left = 0,right = 0;
	D1[0] = D2[0] = 1;
	for ( int i = 1 ; i <= n ; ++i ){
		for ( int j = 1 ; j <= m ; ++j ){
			int now = i*j;
			left -= now; right += now;
			
			for ( int k = left ; k <= right ; ++k ){
				D2[k] += D1[k-now];
				if ( D2[k] >= mod )	D2[k] -= mod;
				D2[k] += D1[k+now];
				if ( D2[k] >= mod )	D2[k] -= mod;
			}
			
			for ( int k = left ; k <= right ; ++k ){
				D1[k] = D2[k];
			}
		}
	}
	
	sol = D1[S];
}

int main () {
	
	fscanf(f,"%d %d %d",&n,&m,&S);
	
	for ( int i = 1 ; i <= n ; ++i ){
		for ( int j = 1 ; j <= m ; ++j ){
			maxs += i*j;
		}
	}
	
	if ( -maxs <= S && S <= maxs ){
		solve();
	}
	
	fprintf(g,"%d\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}