Nu aveti permisiuni pentru a descarca fisierul grader_test11.in
Cod sursa(job #117008)
Utilizator | Data | 20 decembrie 2007 10:24:42 | |
---|---|---|---|
Problema | Tije | 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;
}