Pagini recente » Cod sursa (job #1332918) | Cod sursa (job #1564546) | Cod sursa (job #1200030) | Cod sursa (job #2416078) | Cod sursa (job #573874)
Cod sursa(job #573874)
#include<cstdio>
#include<algorithm>
#include<vector>
#define Nmax 1025
#define M 666013
using namespace std;
int N,S,v[Nmax],val;
vector <pair <int,long long> > a[M];
int cauta(int x){
int hash=x%M;
for(size_t i=0;i<a[hash].size();++i)
if(a[hash][i].first == x){
a[hash][i].second+=val;
return i;
}
return -1;
}
void adauga(int x){
val=1;
if(cauta(x)==-1){
int hash=x%M;
a[hash].push_back(make_pair(x,1));
}
}
void sterge(int x){
val = 0;
int poz=cauta(x);
if(poz!=-1){
int hash=x%M;
a[hash][poz].second--;
if(a[hash][poz].second == 0)
a[hash].erase(a[hash].begin()+poz);
}
}
int plus(int x){
int hash=x%M;
for(size_t i=0;i<a[hash].size();++i)
if(a[hash][i].first == x)
return a[hash][i].second;
return 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",&v[i]);
sort(v+1,v+N+1);
for(int i=3;i<N;++i)
for(int j=i+1;j<=N;++j)
adauga(v[i]+v[j]);
long long sol=0;
for(int j=2;j<=N;++j){
for(int i=1;i<j;++i)
sol+= plus(S-v[i]-v[j]);
for(int i=j+2;i<=N;++i)
sterge(v[j+1]+v[i]);
}
printf("%lld\n",sol);
return 0;
}