Cod sursa(job #117111)

Utilizator ZeusCatalin Tiseanu Zeus Data 20 decembrie 2007 19:08:01
Problema Plus Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.96 kb

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