Cod sursa(job #1144942)

Utilizator raulstoinStoin Raul raulstoin Data 17 martie 2014 19:14:45
Problema Diamant Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<fstream>
#include<cstring>

#define NMAX 25
#define SMAX 44105
#define MOD 10000

using namespace std;

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

int n,m,sum,DP[2][2*SMAX],l,ind[2*SMAX],L;
bool use[2*SMAX];

int main()
{
	fin>>n>>m>>sum;
	use[SMAX-1]=use[SMAX]=use[SMAX+1]=1;
	DP[0][SMAX]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++,l=1-l)
		{
			L=0;
			memset(DP[1-l],0,sizeof DP[1-l]);
			for(int k=0;k<2*SMAX;k++)
			{
				if(!use[k])
					continue;
				DP[1-l][k]+=DP[l][k];
				ind[++L]=k;
				if(k+i*j<2*SMAX)
				{
					DP[1-l][k+i*j]+=DP[l][k];
					if(!use[k+i*j])
						ind[++L]=k+i*j;
				}
				if(k-i*j>0)
				{
					DP[1-l][k-i*j]+=DP[l][k];
					if(!use[k-i*j])
						ind[++L]=k-i*j;
				}
			}
			for(int k=0;k<2*SMAX;k++)
				DP[1-l][k]%=MOD;
			for(int k=1;k<=L;k++)
				use[ind[k]]=1;
		}
	if( sum < (-(m*(m+1)*n*(n+1))/4) || sum > ((m*(m+1)*n*(n+1))/4) )
		fout<<"0";
	else
		fout<<DP[l][sum+SMAX];
	return 0;
}