#include <stdio.h>
#define fin "oite.in"
#define fout "oite.out"
#define Nmax 1025
int N,L,ret,dim,v[Nmax],sume[Nmax*Nmax][3];
int val,pst,pdr;
inline void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }
void qsort(int st,int dr) {
int i,j,m;
i=st; j=dr;
m=sume[(i+j)/2][0];
do {
while (sume[i][0]<m) ++i;
while (sume[j][0]>m) --j;
if (i<=j) {
swap(sume[j][0],sume[i][0]);
swap(sume[j][1],sume[i][1]);
swap(sume[j][2],sume[i][2]);
++i; --j;
}
} while (i<j);
if (i<dr) qsort(i,dr);
if (j>st) qsort(st,j);
}
void search(int st,int dr) {
int m;
if (st>dr) return ;
m=(st+dr)/2;
if (sume[m][0]==val) {
st=m; dr=m+1;
for (;sume[st][0]==val;--st)
if (sume[st][1]>pst && sume[st][2]>pdr && sume[st][1]>pdr && sume[st][2]>pst) {
//fprintf(stderr,"%i %i %i %i\n",sume[st][1],sume[st][2],pst,pdr);
++ret;
}
for (;sume[dr][0]==val;++dr)
if (sume[dr][1]>pst && sume[dr][2]>pdr && sume[dr][1]>pdr && sume[dr][2]>pst) {
//fprintf(stderr,"%i %i %i %i\n",sume[dr][1],sume[dr][2],pst,pdr);
++ret;
}
}
else
if (val<sume[m][0])
search(st,m-1);
else
search(m+1,dr);
}
int main() {
int i,j;
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%i%i",&N,&L);
for (i=1;i<=N;++i)
scanf("%i",&v[i]);
for (i=1;i<=N;++i)
for (j=i+1;j<=N;++j) {
++dim;
sume[dim][0]=v[i]+v[j];
sume[dim][1]=i;
sume[dim][2]=j;
}
qsort(1,dim);
for (i=1;i<=dim;++i) {
//fprintf(stderr,"%i %i %i\n",sume[i][0],sume[i][1],sume[i][2]);
val=L-sume[i][0];
pst=sume[i][1];
pdr=sume[i][2];
search(1,dim);
}
printf("%i\n",ret);
fclose(stdin); fclose(stdout);
return 0;
}