Cod sursa(job #244294)

Utilizator mika17Mihai Alex Ionescu mika17 Data 14 ianuarie 2009 21:07:01
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <vector>
using namespace std;

const int NMAX = 1024;
const double knt = 0.61803398;
int N,S,c[NMAX];
vector<int> hash[NMAX];

inline int h(int x) {

        return int( (double(x * knt) - int(x * knt)) * (NMAX-1) );
}

void insert(int x) {

        hash[h(x)].push_back(x);
}

void append(int pos,int ind) {

        if(hash[pos].size() && hash[pos][ hash[pos].size() - 1] >= 0)
         hash[pos].push_back(-ind);
}

int count(int x,int ind) {

        if(x<0) return 0;
        
        int cnt = 0,i,pos = h(x);

        for(i = 0; i < (int)hash[pos].size(); ++i)
        {
         if(hash[pos][i] == x) ++cnt;
          else
           if(hash[pos][i] < 0 && hash[pos][i] > -ind) cnt = 0;
        }

        return cnt;
}

/* explicatie  hash-ul retine si primul indice i al sumelor (i,j)
cu valoare negativa ( -i) si daca gasim elemente egale cu x
cu indicele negativ mai mare (adica cu indicele pozitiv mai mic)
decat i cnt devine 0
*/

int main() {

        freopen("oite.in","r",stdin);
        freopen("oite.out","w",stdout);

        scanf("%d%d",&N,&S);
        for(int i=1;i<=N;++i)
         scanf("%d",&c[i]);

        for(int i=1;i<N;++i)
        {
         for(int j=i+1;j<=N;++j)
          insert(c[i]+c[j]);

         for(int t=0;t<NMAX;++t)
          append(t,i);
        }

        int cnt = 0;
        for(int i=1;i<N;++i)
         for(int j=i+1;j<=N;++j)
          cnt += count(S - c[i] - c[j],j+1);

        printf("%d",cnt);

        return 0;
}