Pagini recente » Cod sursa (job #1861063) | Cod sursa (job #2716239) | Cod sursa (job #2705636) | Cod sursa (job #2832568) | Cod sursa (job #117112)
Cod sursa(job #117112)
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
LL S, Nr[6], w[6], ret, fac = 1, N;
void gata( LL x )
{
cout << x << endl;
exit( 0 );
}
LL comb( LL n1, LL n2, LL k )
{
LL at = 0;
if( k > n1 + n2 )
return 0;
if( k == 0 )
return 1;
/*
for( LL i = 0; i <= n1 && i <= S; i++ )
{
if( S - i <= n2 )
++at;
}
*/
at = min( n1, k ) - max( k - n2, (LL)0 ) + 1;
return at;
}
void comp001()
{
LL ret = 0;
for( LL i = S; i <= Nr[3]; i++ )
ret += comb( Nr[1] , Nr[2], i - S );
gata( ret );
}
void comp011()
{
LL ret = 0;
for( LL i = 0; i <= Nr[1]; ++i )
ret += comb( Nr[2] , Nr[3], S + i );
gata( ret );
}
void comp111()
{
LL ret = 0;
for( LL i = 0; i <= Nr[1] && i <= S; i++ )
ret += comb( Nr[2], Nr[3], S - i );
gata( ret );
}
int main()
{
freopen("plus.in", "r", stdin);
freopen("plus.out", "w", stdout);
cin >> S;
for( int i = 0; i < 3; ++i )
cin >> Nr[i] >> w[i];
for( int i = 0; i < 3; i++ )
if( w[i] == 0 )
fac *= ( Nr[i] + 1 );
else
Nr[N] = Nr[i], w[N++] = w[i];
for( int i = 0; i < N; i++ )
for( int j = 0; j < N - 1; j++ )
if( w[j] > w[j+1] )
swap( w[j], w[j+1] ),
swap( Nr[j], Nr[j+1] );
/*
cout << N << " : " << fac << endl;
for( int i = 0; i < N; i++ )
cout << Nr[i] << " : " << w[i] << endl;
cout << "----" << endl;
*/
for( int i = N; i >= 1; i-- )
Nr[i] = Nr[i-1],
w[i] = w[i-1];
/*
cout << N << " : " << fac << endl;
for( int i = 1; i <= N; i++ )
cout << Nr[i] << " : " << w[i] << endl;
while(1);
*/
if( N == 1 )
{
if( w[1] == -1 )
{
if( S == 0 )
gata( fac );
else
gata( 0 );
}
else
{
if( S <= Nr[1] )
gata( fac );
else
gata( 0 );
}
}
else if( N == 2 )
{
// cout << " XX " << endl;
if( w[1] == -1 && w[2] == -1 )
{
if( S == 0 )
gata( fac );
else
gata( 0 );
}
else if( w[1] == -1 && w[2] == 1 )
{
// cout << " ! " << endl;
if( S <= Nr[2] )
gata( fac * min( Nr[2] - S + 1, Nr[1] + 1 ) );
else
gata( 0 );
}
else if( w[1] == 1 && w[2] == 1 )
{
if( Nr[1] + Nr[2] >= S )
gata( fac * comb( Nr[1] , Nr[2], S ) );
else
gata( 0 );
}
}
else
{
// cout << w[1] << " : " << w[2] << " : " << w[3] << endl;
// while(1);
exit(1);
if( w[1] == -1 && w[2] == -1 && w[3] == -1 )
{
if( S == 0 )
gata( fac );
else
gata( 0 );
}
else if( w[1] == -1 && w[2] == -1 && w[3] == 1 )
{
if( S <= Nr[3] )
comp001();
else
gata( 0 );
}
else if( w[1] == -1 && w[2] == 1 && w[3] == 1 )
{
if( S <= Nr[2] + Nr[2] )
comp011();
else
gata( 0 );
}
else if( w[1] == 1 && w[2] == 1 && w[3] == 1 )
{
if( S <= Nr[1] + Nr[2] + Nr[3] )
comp111();
else
gata( 0 );
}
}
return 0;
}