Cod sursa(job #801511)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 24 octombrie 2012 16:09:09
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <vector>
using namespace std;

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

const int mod = 10000;
int N, M, K, total; 
vector <short int> V1, V2;

void cit ()
{
	fi >> N >> M >> K;	
}

void back (int x, int y, int s)
{
	if (x > M) x = 1, y++;
	if (y > N) 
	{
		if (s == K)
		{
			total++;
			if (total == mod)
				total = 0;
		}
		return;
	}
	
	back (x + 1, y, s + x * y);
	back (x + 1, y, s);
	back (x + 1, y, s - x * y);
}

void preg1 (int lg)
{
	for (int i = V1.size(); i < lg; i++)
		V1.push_back (0);
	for (int i = 0; i < V2.size(); i++)
		V1[i] = V2[i];
}

void preg2 (int lg)
{
	for (int i = 0; i < V2.size(); i++)
		V2[i] = 0;
	for (int i = V2.size(); i < lg; i++)
		V2.push_back (0);
}

void add (int poz)
{
	for (int i = 0; i < V1.size(); i++)
	{
		V2[poz + i] += V1[i];
		if (V2[poz + i] >= mod)
			V2[poz + i] -= mod;
	}
}

void rucsac ()
{
	int i, j, x, lg = 1;
	V1.push_back (1);
	V2.push_back (0);
	
	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= M; j++)
		{
			x = i * j;
			
			preg2 (lg + (x<<1));
			add (0);
			add (x);
			add (x + x);
			preg1 (lg + (x<<1));
			
			lg += x<<1;
			
			/*
			for (int i = 0; i < V1.size(); i++)
				fo << V1[i] << ' ';
			fo << '\n';
			*/
		}
	}
	if ((V1.size()>>1) + K < V1.size())
		fo << V1[(V1.size()>>1) + K] << '\n';
	else
		fo << '0' << '\n';
}

int main ()
{
	cit ();
	
	/*
	back (1, 1, 0);
	fo << total << '\n';
	total = 0;
	*/
	
	rucsac ();
	
	return 0;
}