Cod sursa(job #64417)

Utilizator goguGogu Marian gogu Data 3 iunie 2007 01:53:58
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#include <algorithm>
#define MOD 312457

using namespace std;

struct rec {
       unsigned p, val, nr; 
};

unsigned n, sol;
unsigned s, a[1200], aloc = MOD;
rec h[MOD+(1<<20)];

void baga(unsigned x)
{
     unsigned key = x%MOD;
     while (h[key].p){
           if (h[key].val == x){
              h[key].nr++;
              return;
           }
           key=h[key].p;
     }
     h[key].p = aloc++;
     h[key].val = x;
     h[key].nr = 1;
}

unsigned count(unsigned x)
{
    unsigned key = x%MOD;
    while (h[key].p){
          if (h[key].val==x) return h[key].nr;
          key=h[key].p;
    }
    return 0;
}

int main()
{
    freopen("oite.in", "r", stdin);
    freopen("oite.out", "w", stdout);
    scanf("%u %u", &n, &s);
    unsigned i,k;
    for (i=0; i<n; i++)
        scanf("%u", a+i);
    sort(a, a+n);
    reverse(a+n, a);
    for (k=2; k<n-1; k++){
        for (i=0; i<k-1; i++)
            baga(a[k-1]+a[i]);
        for (i=k+1; i<n; i++)
            sol += count(s-a[k]-a[i]);
    }
    printf("%u\n", sol);
    return 0;
}