Pagini recente » Cod sursa (job #1230401) | Cod sursa (job #2109887) | Cod sursa (job #868284) | Cod sursa (job #1450024) | Cod sursa (job #490855)
Cod sursa(job #490855)
#include <stdio.h>
struct list
{
int x,y,s;
list *link;
}*H[500002],*p;
int i,j,n,m,pow,nr,s,S,v[1027],x;
void addlink(int pos,int s,int x,int y)
{
list *p;
p=new list;
p->s=s;
p->x=x;
p->y=y;
p->link=H[pos];
H[pos]=p;
}
void quicksort(int L,int R)
{
int i=L,j=R,aux;
int piv=v[(L+R)/2];
while(i<=j)
{
while(piv<v[j]) j--;
while(v[i]<piv) i++;
if(i<=j)
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
i++;
j--;
}
}
if(L<j) quicksort(L,j);
if(i<R) quicksort(i,R);
}
int main()
{
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
scanf("%d%d",&n,&S);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
quicksort(1,n);
m=(n*n)/2;
pow=1;
while(pow<=m) pow*=2;
m=(pow/2+pow)/2;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
s=v[i]+v[j];
x=s%m;
addlink(x,s,i,j);
}
nr=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
s=v[i]+v[j];
if(s<=S)
{
x=(S-s)%m;
p=H[x];
while(p!=NULL)
{
if(p->s==S-s)
if(p->x>i&&p->x>j&&p->y>i&&p->y>j) nr++;
p=p->link;
}
}
else break;
}
printf("%d\n",nr);
return 0;
}