Cod sursa(job #33857)

Utilizator filipbFilip Cristian Buruiana filipb Data 19 martie 2007 21:15:40
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define suma first
#define cnt second
#define NMax 1025
#define MOD 666013

using namespace std;

int N, S, v[NMax], CNT = 0;
vector< pair<int, int> > HASH[MOD];

int query_hash(int S)
{
    int i = S % MOD;
    vector< pair<int, int> >::iterator it;
        
    for (it = HASH[i].begin(); it != HASH[i].end(); it++)
        if (it->suma == S)
           return it->cnt;

    return 0;
}

void add_hash(int S)
{
    int i = S % MOD;     
    vector< pair<int, int> >::iterator it;
        
    for (it = HASH[i].begin(); it != HASH[i].end(); it++)
        if (it->suma == S)
        { it->cnt++; return ; }
        
    HASH[i].push_back( make_pair(S, 1) );
}

int main(void)
{
    int i, j;
    
    freopen("oite.in", "r", stdin);
    freopen("oite.out", "w", stdout);
  
    scanf("%d %d", &N, &S);
    for (i = 1; i <= N; i++)
        scanf("%d", &v[i]);  
    
    for (i = 1; i <= N; i++)
    {
        for (j = i+1; j <= N; j++)
        {
            if (!(v[i] <= S && v[j] <= S && v[i] + v[j] <= S)) continue;
            CNT += query_hash(S - v[i] - v[j]);
        }
        
        for (j = 1; j < i; j++)
        {            
            if (!(v[i] <= S && v[j] <= S && v[i] + v[j] <= S)) continue;
            add_hash(v[i] + v[j]);
        }
        
    }
    
    printf("%d\n", CNT);
    
    return 0;
}