Cod sursa(job #117004)

Utilizator silviugSilviu-Ionut Ganceanu silviug Data 20 decembrie 2007 09:50:30
Problema Plus Scor Ascuns
Compilator cpp Status done
Runda Marime 1.38 kb
#include <stdio.h>

int S;
int Nr[3], Val[3];

inline int Max( int x, int y ) { return (x > y) ? x : y; }
inline int Min( int x, int y ) { return (x < y) ? x : y; } 

inline long long getNr( int val, int S )
{
	int x[4] = {0, 0, 0, 0};
	for (int i = 0; i < 3; i++)
		if (Val[i] == val)
			x[ ++x[0] ] = Nr[i];
	
	if (x[0] == 1)
		return x[1] >= S;
	if (x[0] == 2)
	{
		int l, r;
		l = Max(0, S - x[2]);
		if (l > x[1])
			return 0;

		r = Min(x[1], S);
		if (S - r > x[2])
			return 0;
		return r - l + 1;
	}
	if (x[0] == 3)
	{
		//daca toate 3 au acelasi semn atunci foru din main are o singura iteratie, tot merge :P
		Val[0] = -2;
		long long rez = 0;
		for (int i = 0; i <= Nr[0]; i++)
			rez += getNr( val, S - i );
	
		Val[0] = val;
		return rez;
	}
	//x[0] == 0
	return (S == 0);
}

int main()
{
	freopen("plus.in", "rt", stdin);
	freopen("plus.out", "wt", stdout);

	scanf("%d", &S);
	for (int i = 0; i < 3; i++)
		scanf("%d %d", Nr + i, Val + i);

	int sP = 0, sN = 0;
	for (int i = 0; i < 3; i++)
	{
		if (Val[i] == 1)
			sP += Nr[i];
		if (Val[i] == -1)
			sN += Nr[i];
	}

	long long NR = 0;
	for (int k = S; k <= sP && S - k <= sN; k++)
	{
		//trebuie obtinuta suma k cu numerele pozitive si suma S - k cu numerele negative
		long long curNr = getNr( 1, k ) * getNr( -1, S - k );

		NR += curNr;
	}

	for (int i = 0; i < 3; i++)
		if (Val[i] == 0)
			NR *= Nr[i] + 1;

	printf("%lld\n", NR);
	return 0;
}