Cod sursa(job #272441)

Utilizator alex23alexandru andronache alex23 Data 7 martie 2009 01:37:38
Problema Plus Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.48 kb
#include <iostream>

using namespace std;

FILE *f = fopen("plus.in", "r"), *g = fopen("plus.out", "w");

long long S, N1, N2, N3, B1, B2, B3;

long long numar = 0;

void swap(long long *a, long long *b, long long *c, long long *d)
{
	int aux = *a;
	*a = *b;
	*b = aux;
	aux = *c;
	*c = *d;
	*d = aux;
}

long long min(long long a, long long b)
{
	if (a < 0) return 0;
	if (b < 0) return 0;
	if (a < b)
		return a;
	return b;
}

void afisare(long long x)
{
	fprintf(g, "%lld", x);
	fclose(g);
}


int main()
{

	fscanf(f, "%lld\n", &S);
	fscanf(f, "%lld %lld", &N1, &B1);
	fscanf(f, "%lld %lld", &N2, &B2);
	fscanf(f, "%lld %lld", &N3, &B3);
	fclose(f);

	if (B1 <= B2)
	{
		if (B3 <= B1)
		{
			swap(&B1, &B3, &N1, &N3);
			swap(&B2, &B3, &N2, &N3);
		}
		else
		{
			if (B3 < B2)
			{
				swap(&B2, &B3, &N2, &N3);
			}
		}
	}
	else
	{
		swap(&B1, &B2, &N1, &N2);
		if (B3 <= B1)
		{
			swap(&B1, &B3, &N1, &N3);
			swap(&B2, &B3, &N1, &N3);
		}
		else
		{
			if (B3 < B2)
			{
				swap(&B2, &B3, &N2, &N3);
			}
		}
	}

	if (B3 == -1) // -1 -1 -1
	{
		if (S == 0)
		{
			afisare(1);
			return 0;
		}

		afisare(0);
		return 0;
	}
	if ((B2 == -1) && (B3 == 0)) // -1 -1 0
	{
		if (S == 0)
		{
			afisare(1 + N3);
			return 0;
		}
		afisare(0);
		return 0;
	}
	if ((B2 == -1) && (B3 == 1)) // -1 -1 1
	{
		if (S == 0)
		{
			numar = 1 + min(N3, N1) + min(N3, N2);
			for (long long i = min(N1, N3); i >= 1; --i)
			{
				// cate numere dintre 1 si N2 sunt mai mici sau egale decat N3 - i
				numar = numar + min(N2, N3 - i);
			}
			afisare(numar);
			return 0;
		}
		if (S > N3)
		{
			afisare(0);
			return 0;
		}
		
		for (long long i = min(N3, N1 + N2 + S); i >= S; --i)
		{
			//trebuie sa vedem in cate moduri se poate obtine j din N1 si N2
			long long j = i - S;
			long long i1 = min(j, N1), j1 = j - i1;
			while ((i1 >= 0) && (j1 <= N2))
			{
				numar++;
				i1--;
				j1++;
			}
		}
		afisare(numar);
		return 0;
	}
	if ((B1 == -1) && (B3 == 0)) // -1 0 0
	{
		if (S > 0)
		{
			afisare(0);
			return 0;
		}
		afisare(1 + N2 + N3 + N2 * N3);
		return 0;

	}
	if ((B1 == -1) && (B2 == 0) && (B3 == 1)) // -1 0 1
	{
		if (S == 0)
		{
			afisare(1 + N2 + min(N1, N3) * (1 + N2));
			return 0;
		}
		long long i = S, j = 0;
		while ((i <= N3) && (j <= N1))
		{
			++i;
			++j;
			numar = numar + N2;
		}
	}
	if ((B1 == -1) && (B2 == 1)) // -1 1 1
	{
		if (S == 0)
		{
			numar = 1 + min(N2, N1) + min(N3, N1);
            for (long long i = min(N1, N3); i >= 1; --i)
			{
				// cate numere dintre 1 si N2 sunt mai mici sau egale decat N3 - i
				numar = numar + min(N2, N1 - i);
			}
			afisare(numar);
			return 0;
		}
		
		if (S > N2 + N3)
		{
			afisare(0);
			return 0;
		}

        for (long long i = min(N1 + S, N2 + N3); i >= S; --i)
		{
			//trebuie sa vedem in cate moduri se poate obtine i din N3 si N2
			long long i1 = min(i, N3), j1 = i - i1;
			while ((i1 >= 0) && (j1 <= N2))
			{
				numar++;
				i1--;
				j1++;
			}
		}
		afisare(numar);
		return 0;
	}
	if (B3 == 0)  // 0 0 0 
	{
		if (S > 0)
		{
			afisare(0);
			return 0;
		}
		numar = 1 + N1 + N2 + N3 + N1 * N2 + N1 * N3 + N2 * N3 + N1 * N2 * N3;
		afisare(numar);
		return 0;
	}
	if ((B2 == 0) && (B3 == 1)) // 0 0 1
	{
		if (S == 0)
		{
			numar = 1 + N1 + N2 + N1 * N2;
			afisare(numar);
			return 0;
		}
		if (S > N3)
		{
			afisare(0);
			return 0;
		}
		numar = 1 + N1 + N2 + N1 * N2;
		afisare(numar);
		return 0;
	}
	if ((B1 == 0) && (B2 == 1)) //0 1 1
	{
		if (S == 0)
		{
			numar = 1 + N1;
			afisare(numar);
			return 0;
		}
		if (S > N2 + N3)
		{
			afisare(0);
			return 0;
		}
		// in cate moduri se poate obtine S din N2 si N3 inmultita cu (1 + N1)
		long long i = min(S, N2), j = i - S;
		while ((i >= 0) && (j <= N3))
		{
			numar++;
			--i;
			++j;
		}
		numar = numar * (1 + N1);
		afisare(numar);
		return 0;
	}
	if (B3 == 1) // 1 1 1 
	{
		if (S == 0)
		{
			afisare(0);
			return 0;
		}
		if (N1 + N2 + N3 < S)
		{
			afisare(0);
			return 0;
		}
		// in cate moduri se poate obtine S din N1, N2 si N3
		for (long long i = min(S, N1); i >= 0; --i)
		{
			// in cate moduri se poate obtine S - i din N2 si N3
			long long jj = S - i;
			long long j = min(jj, N2), k = j - jj;
			while ((j >= 0) && (k <= N3))
			{
				++numar;
				--j;
				++k;
			}
		}
		afisare(numar);
		return 0;
	}

	return 0;
}