Cod sursa(job #489353)

Utilizator ZethpixZethpix Zethpix Data 2 octombrie 2010 12:40:31
Problema Oite Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#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;
}

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=n*n;
	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;
				}
			}
		}

	printf("%d\n",nr);
	return 0;
}