Cod sursa(job #251855)

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

#define MAX 90000
#define restRez 10000
#define pb push_back

using namespace std;

int n, m, nr, sum, sumPart;
vector <int> vctNr;

int vctPos[MAX], vctPosV[MAX];
#define vctPos (vctPos + 45000)
#define vctPosV (vctPosV + 45000)
char vctVal[MAX], vctValV[MAX];
#define vctVal (vctVal + 45000)
#define vctValV (vctValV + 45000)

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);
			sumPart += i * j;
		}

	vctPos[0] = vctPosV[0] = vctVal[0] = vctValV[0] = 1;

	for (int i = 0; i < vctNr.size(); i++)
	{
		for (int j = -sumPart; j <= sumPart; j++)
			if (vctValV[j])
			{
				vctPos[j + vctNr[i]] = (vctPos[j + vctNr[i]] + vctPosV[j]) % restRez;
				vctVal[j + vctNr[i]] = 1;
				vctPos[j - vctNr[i]] = (vctPos[j - vctNr[i]] + vctPosV[j]) % restRez;		
				vctVal[j - vctNr[i]] = 1;
			}

		for (int j = -sumPart; j <= sumPart; j++)
		{
			vctValV[j] = vctVal[j];
			vctPosV[j] = vctPos[j];
		}
	}

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

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