#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;
}