Pagini recente » Cod sursa (job #919003) | Cod sursa (job #2197094) | Cod sursa (job #3160609) | Cod sursa (job #769795) | Cod sursa (job #75540)
Cod sursa(job #75540)
#include<stdio.h>
#define Nm 1024
#define M1 2097143
#define M2 4194301
int A[Nm],n,l;
long long ans;
struct node
{
int v;
int n;
node *next;
};
typedef node *list;
list T1[M1],T2[M2];
void read()
{
int i;
freopen("oite.in","r",stdin);
scanf("%d%d",&n,&l);
for(i=0;i<n;++i)
scanf("%d",A+i);
}
void add(list &l, int v)
{
if(!l)
{
l=new node;
l->v=v;
l->n=1;
l->next=NULL;
return;
}
list q=l;
while(q->next && q->v!=v)
q=q->next;
if(q->v==v)
++(q->n);
else
{
q->next=new node;
q->next->v=v;
q->next->n=1;
q->next->next=NULL;
}
}
int search(list l, int v)
{
while(l && l->v!=v)
l=l->next;
if(!l)
return 0;
return l->n;
}
void solve()
{
int i,j,k,s;
for(i=0;i<n;++i)
if(A[i]<=l)
add(T1[A[i]%M1],A[i]);
for(i=0;i<n;++i)
for(j=i+1;j<n;++j)
{
s=A[i]+A[j];
if(s<=l)
add(T2[s%M2],s);
}
for(i=0;i<n;++i)
for(j=i+1;j<n;++j)
{
s=A[i]+A[j];
if(s<=l)
{
s=l-s;
k=search(T2[s%M2],s);
if(k && A[i]<=s)
{
k-=search(T1[(s-A[i])%M1],s-A[i]);
if(A[i]<<1==s)
++k;
}
if(k && A[j]<=s)
{
k-=search(T1[(s-A[j])%M1],s-A[j]);
if(A[j]<<1==s)
++k;
}
if(A[i]+A[j]==s)
++k;
ans+=k;
}
}
ans/=6;
}
void write()
{
freopen("oite.out","w",stdout);
printf("%lld\n",ans);
}
int main()
{
read();
solve();
write();
return 0;
}