Cod sursa(job #167840)

Utilizator ProtomanAndrei Purice Protoman Data 30 martie 2008 11:40:10
Problema Oite Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#define bz ((1<<19)-1)
#define bz2 3
#define mx ((1<<20)+5)
struct poi
{
	long s,a,b;
} s[mx+2];
struct nod
{
	poi el;
	nod *ua;
} *l[bz+2][bz2+2];
long i,j,c,sm,ct,nr;
long a[1035];

void clad(long loc1, long loc2, poi x)
{
	nod *p;
	p=new nod;
	p->el=x;
	p->ua=l[loc1][loc2];
	l[loc1][loc2]=p;
}

void cauta(long loc1, long loc2, poi x)
{
	nod *p;
	p=l[loc1][loc2];
	while (p)
	{
		poi h=(p->el);
		if (h.s==sm-x.s && h.a!=x.a && h.a!=x.b && h.b!=x.a && h.b!=x.b)
			nr++;
		p=p->ua;
	}
}

int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	scanf("%ld %ld",&c,&sm);
	for (i=1; i<=c; i++)
		scanf("%ld",&a[i]);
	for (i=1; i<c; i++)
		for (j=i+1; j<=c; j++)
		{
			ct++;
			s[ct].s=a[i]+a[j];
			s[ct].a=i;
			s[ct].b=j;
			clad((s[ct].s)%bz,(s[ct].s)%bz2,s[ct]);
		}
	for (i=1; i<=ct; i++)
		cauta((sm-s[i].s)%bz,(sm-s[i].s)%bz2,s[i]);
	printf("%ld",nr/6);
	fclose(stdin);
	fclose(stdout);
	return 0;
}