Cod sursa(job #272407)

Utilizator alex23alexandru andronache alex23 Data 6 martie 2009 23:29:13
Problema Plus Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.05 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 < 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)
	{
		if (S == 0)
		{
			afisare(1);
			return 0;
		}

		afisare(0);
		return 0;
	}
	if ((B2 == -1) && (B3 == 0))
	{
		if (S == 0)
		{
			afisare(1 + N3);
			return 0;
		}
		afisare(0);
		return 0;
	}
	if ((B2 == -1) && (B3 == 1))
	{
		if (S == 0)
		{
			afisare(1);
			return 0;
		}
		if (S <= N1)
		{
			afisare(1);
			return 0;
		}
		afisare(0);
		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) * 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);
            long long i = S, j = 0;
			while ((i <= N2 + N3) && (j <= N1))
			{
				++i;
				++j;
				//tb sa vad in cate moduri se poate obtine i din N2 si N3
				long long i1 = i, j1 = 0;
				while ((i1 >= 0) && (j1 <= N3))
				{
					if (i1 <= N2) 
					{
						numar++;
					}
					--i1;
					++j1;
				}
			}
			afisare(numar);
			return 0;
		}
		
		if (S > N2 + N3)
		{
			afisare(0);
			return 0;
		}
		long long i = S, j = 0;
		while ((i <= N2 + N3) && (j <= N1))
		{
			//trebuie sa vedem in cate moduri se poate face i;
			long long i1 = i, j1 = 0;
			while ((i1 >= 0) && (j1 <= N3))
			{
				if (i1 <= N2)
				{
					numar++;
				}
				--i1;
				++j1;
			}
			++i;
			++j;
		}
	}
	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 = S, j = 0;
		while ((i >= 0) && (j <= N3))
		{
			if (i <= N2)
			{
				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 j = S - i, k = 0;
			while ((j >= 0) && ( k <= N3))
			{
				if (j <= N2)
				{
					++numar;
				}
				--j;
				++k;
			}
		}
		afisare(numar);
		return 0;
	}

	return 0;
}