Cod sursa(job #847772)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 4 ianuarie 2013 14:41:28
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include<iostream>
#include<fstream>
using namespace std;

#define NMAX 21
#define SMAX NMAX*NMAX*(NMAX-1)*(NMAX-1)/4
#define MOD 10000

int s[2*(SMAX+1)],d[2*(SMAX+1)],smax;

#define s (s + SMAX)
#define d (d + SMAX)

int dp(int n, int m, int sum)
{
	int i,j,k,x;
	s[0]=1;
	for(i=1;i<=n;i++) 
		for(j=1;j<=m;j++) {
			x=i*j;
			for(k=smax-x;k>=-smax;k--)
				if(s[k])
					d[k+x]=s[k];
			for(k=-smax+x;k<=smax;k++)
				if(s[k])
					d[k-x]=d[k-x]+s[k];
			for(k=-smax;k<=smax;k++)
				s[k]=(s[k]+d[k])%MOD;
		}
	return s[sum];
}

int main ()
{
	int n,m,sum;
	ifstream f("diamant.in");
	ofstream g("diamant.out");
	f>>n>>m>>sum;
	f.close();
	smax=n*m*(n+1)*(m+1)/4;
	if(sum>smax)
		g<<"0";
	else g<<dp(n,m,sum);
	g.close();
	return 0;
}