Cod sursa(job #119597)

Utilizator gcosminGheorghe Cosmin gcosmin Data 2 ianuarie 2008 11:49:41
Problema Plus Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>

#define LL long long

int S;

int nr[5], s[5];

int nr0[5];

int a, sa, b, sb, e;

inline int MAX(int a, int b) { return (a > b) ? a : b; }
inline int MIN(int a, int b) { return (a < b) ? a : b; }

int nr_aleg(int S)
{
	if (!e) {
		if (S == 0) return 1;
		if (S < 0 && sa < 0 && S <= a) return 1;
		if (S > 0 && sa > 0 && S <= a) return 1;

		return 0;
	}

	if (sa > 0 && sb > 0) {
		if (S == 0) return 1;
		if (S < 0) return 0;

		return MAX( MIN(S, a) - MAX(S - b, 0) + 1, 0 );
	}

	if (sa < 0 && sb < 0) {
		if (S == 0) return 1;
		if (S > 0) return 0;

		return MAX( MIN(S, a) - MAX(S - b, 0) + 1, 0 );
	}

	return MAX( MIN(a, S + b) - MAX(0, S) + 1, 0 );
}

int main()
{
	int i;

	freopen("plus.in", "r", stdin);
	freopen("plus.out", "w", stdout);

	scanf("%d", &S);

	for (i = 1; i <= 3; i++) {
		scanf("%d %d", &nr[i], &s[i]);
		if (!s[i]) nr0[i] = nr[i];
	}

	for (i = 1; i <= 3; i++) 
		if (s[i] == 1) break;

	if (i == 4) {
		if (S) printf("0\n");
		else printf("%lld\n", (LL) (nr0[1] + 1) * (nr0[2] + 1) * (nr0[3] + 1));
		return 0;
	}

	int q = nr[i];
	s[i] = 0;

	e = 0;

	for (i = 1; i <= 3; i++)
		if (s[i] != 0) {
			if (!e) a = nr[i], sa = s[i], e = 1;
			else b = nr[i], sb = s[i];
		}

	if (!sb) e = 0;

	LL rez = 0;
	for (i = 0; i <= q; i++) {
//		printf("%d - %d\n", S - i, nr_aleg(S - i));
		rez += (LL) nr_aleg(S - i) * (nr0[1] + 1) * (nr0[2] + 1) * (nr0[3] + 1);
	}

	printf("%lld\n", rez);

return 0;
}