Cod sursa(job #514914)

Utilizator mottyMatei-Dan Epure motty Data 19 decembrie 2010 20:56:14
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

ifstream in("diamant.in");
ofstream out("diamant.out");

const int N=22, MOD=10000;

int n, m, x, mx, c[N], d[N];

#define a (c+10)
#define b (d+10)

int main()
{
	in >> n >> m >> x;
	mx=n*m*(n+1)*(m+1)/4;
	
	if(x>mx || x<-mx)
	{
		out << "0" << "\n";
		return 0;
	}
	
	a[0]=1;
	
	for( int i=1; i<=n; ++i)
		for( int j=1; j<=m; ++j)
		{
			memset( d, 0, sizeof(d));
			
			b[-i*j]=b[i*j]=b[0]=a[0];
			
			for( int k=1; k<=mx; ++k)
			{
				if(a[-k])
				{
					b[-k]=(b[-k]+a[-k])%MOD;
					b[-k+i*j]=(b[-k+i*j]+a[-k])%MOD;
					if(-k-i*j>=-mx)
						b[-k-i*j]=(b[-k-i*j]+a[-k])%MOD;
				}
				if(a[k])
				{
					b[k]=(b[k]+a[k])%MOD;
					b[k-i*j]=(b[k-i*j]+a[k])%MOD;
					if(k+i*j<=mx)
						b[k+i*j]=(b[k+i*j]+a[+k])%MOD;
				}
			}
			
			memcpy( c, d, sizeof(d));
		}
	
	out << a[x] << "\n";
	
	return 0;
}