Cod sursa(job #34624)

Utilizator gigi_becaliGigi Becali gigi_becali Data 20 martie 2007 23:22:53
Problema Diamant Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
#include <algorithm>
#define mod 10000
using namespace std;

int n, m, S, smax;
int x[1<<20], N;
int dp[1000000];
#define dp (dp+500000)

void citire()
{
	freopen("diamant.in", "r", stdin);
	scanf("%d %d %d\n", &n, &m, &S);
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++) x[++N]=i*j;//, x[++N]=-i*j, x[++N]=0;

	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++) smax+=i*j;
	
	sort(x+1, x+N+1);
}
void dynamic()
{
	int i, j;
	dp[0]=1;
	
	for(i=1;i<=N;i++)
		for(j=smax;j>=-smax;j--)
		{
			dp[j]+=dp[j-x[i]];
			dp[j]+=dp[j+x[i]];
			
			while(dp[j]>mod) dp[j]-=mod;
		}
	freopen("diamant.out", "w", stdout);
//	for(i=-S;i<=S;i++) printf("%d ", dp[i]);
	//printf("\n");
	printf("%d\n", (dp[S]>>1)%mod);
}



int main()
{
	citire();
	dynamic();
	return 0;
}