Cod sursa(job #251822)

Utilizator ProtomanAndrei Purice Protoman Data 3 februarie 2009 13:55:29
Problema Diamant Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define MAX (1 << 16)
#define restRez 10000
#define pb push_back

using namespace std;

int n, m, nr, sum, nrSums;
vector <int> vctNr, vctSums;

int vctPos[MAX * 2];
#define vctPos (vctPos + MAX)
char vctVal[MAX * 2];
#define vctVal (vctVal + MAX)

int main()
{
	freopen("diamant.in", "r", stdin);
	freopen("diamant.out", "w", stdout);

	scanf("%d %d %d", &n, &m, &sum);

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			vctNr.pb(i * j);

	vctPos[0] = vctVal[0] = 1;
	vctSums.pb(0);

	for (int i = 0; i < vctNr.size(); i++)
	{
		vector <int> vctDePus;
		vector <pair <int, int> > vctDeModif;

		for (int j = 0; j < vctSums.size(); j++)
		{
			if (!vctVal[vctNr[i] + vctSums[j]])
				vctDePus.pb(vctNr[i] + vctSums[j]);
			if (!vctVal[-vctNr[i] + vctSums[j]])
				vctDePus.pb(-vctNr[i] + vctSums[j]);
			vctDeModif.pb(make_pair(vctNr[i] + vctSums[j], vctPos[vctSums[j]]));
			vctDeModif.pb(make_pair(-vctNr[i] + vctSums[j], vctPos[vctSums[j]]));
		}

		for (int j = 0; j < vctDePus.size(); j++)
			vctSums.pb(vctDePus[j]);
		for (int j = 0; j < vctDeModif.size(); j++)
		{
			vctPos[vctDeModif[j].first] = (vctPos[vctDeModif[j].first] + vctDeModif[j].second) % restRez;
			vctVal[vctDeModif[j].first] = 1;
		}
	}

	if (sum > 44100 || sum < -44100)
		printf("%d\n", 0);
	else printf("%d\n", vctPos[sum]);

	fclose(stdin);
	fclose(stdout);
	return 0;
}