Pagini recente » Cod sursa (job #951369) | Cod sursa (job #1846192) | Cod sursa (job #1424280) | Cod sursa (job #1746552) | Cod sursa (job #489360)
Cod sursa(job #489360)
#include <stdio.h>
struct list
{
int x,y,s;
list *link;
}*H[2000002],*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;
}
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]);
m=S;
if(m>1000000) m/=1000;
pow=1;
while(pow<=m) pow*=2;
m=(pow/2+pow)/2-pow/8;
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;
}
}
}
printf("%d\n",nr);
return 0;
}