Pagini recente » Cod sursa (job #2519429) | Cod sursa (job #11382) | Cod sursa (job #218150) | Cod sursa (job #755455) | Cod sursa (job #594058)
Cod sursa(job #594058)
#include <cstdio>
#include <utility>
#include <string>
using namespace std;
#define MAXN 1026
#define MOD 666013
#define LG 6
#define NOT -1
pair<int,short> H[MOD][LG];
inline int find(int x){
int key=x%MOD, i;
for(i=0; i<LG; i++)
if(H[key][i].first == x)
return i;
return NOT;
}
inline void add(int x){
int key=x%MOD, i;
if((i=find(x)) == NOT){
for(i=0; i<LG; i++)
if(!H[key][i].first)
H[key][i]=make_pair(x,1);
}
else
++H[key][i].second;
}
inline void erase(int x){
int key=x%MOD, i;
if((i=find(x)) != NOT)
--H[key][i].second;
}
inline int getcnt(int x){
int key=x%MOD, i;
for(i=0; i<LG; i++)
if(H[key][i].first == x)
return H[key][i].second;
return 0;
}
int main(){
freopen("oite.in", "r", stdin);
freopen("oite.out", "w", stdout);
int N, L, A[MAXN], i, j, res, k;
scanf("%d%d", &N, &L);
for(i=0; i<N; i++)
scanf("%d", A+i);
memset(H, 0, sizeof(H));
for(i=0; i<N; i++)
for(j=i+1; j<N; j++)
if(A[i]+A[j] < L)
add(A[i]+A[j]);
res=0;
for(i=0; i<N; i++){
for(j=i+1; j<N; j++)
erase(A[i]+A[j]);
for(j=i+1; j<N; j++)
if(A[i]+A[j] < L){
for(k=0; k<N; k++)
erase(A[j]+A[k]);
res+=getcnt(L-A[i]-A[j]);
for(k=0; k<N; k++)
add(A[j]+A[k]);
}
}
printf("%d\n", res);
return 0;
}