Pagini recente » Cod sursa (job #546816) | Cod sursa (job #561172) | Cod sursa (job #1902685) | Cod sursa (job #48110) | Cod sursa (job #75539)
Cod sursa(job #75539)
#include<stdio.h>
#define Nm 1024
#define M 524287
int A[Nm],Nr1[M],Nr2[M],n,l;
long long ans;
struct node
{
int v;
int n;
node *next;
};
typedef node *list;
list T[M],T1[M],T2[M];
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,p1,p2,k,s;
for(i=0;i<n;++i)
if(A[i]<=l)
add(T[A[i]%M],A[i]);
for(i=0;i<n;++i)
for(j=i+1;j<n;++j)
{
s=A[i]+A[j];
if(s<=l)
{
p1=s%M;
p2=s%(M-1);
if(search(T1[p1],s))
{
add(T1[p1],s);
continue;
}
if(search(T2[p2],s))
{
add(T2[p2],s);
continue;
}
if(Nr1[p1]<=Nr2[p2])
{
add(T1[p1],s);
++Nr1[p1];
}
else
{
add(T2[p2],s);
++Nr2[p2];
}
}
}
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(T1[s%M],s);
if(!k)
k=search(T2[s%(M-1)],s);
if(A[i]<=s)
{
k-=search(T[(s-A[i])%M],s-A[i]);
if(A[i]+A[i]==s)
++k;
}
if(A[j]<=s)
{
k-=search(T[(s-A[j])%M],s-A[j]);
if(A[j]+A[j]==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;
}