Cod sursa(job #167864)

Utilizator ProtomanAndrei Purice Protoman Data 30 martie 2008 12:05:16
Problema Oite Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <stdio.h>
#define dif 10000
#define bz 5981289
#define mx ((1<<20)+5)
struct poi
{
	long s,a;
} s[mx+2],h;
struct nod
{
	poi el;
	nod *ua;
} *l[bz+2];
long i,j,c,sm,ct,nr,a1,a2;
long a[1035];

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

void cauta(long loc1, poi x)
{
	nod *p;
	p=l[loc1];
	while (p)
	{
		h=(p->el);
		a1=h.a/dif;
		a2=h.a%dif;
		if (h.s==sm-x.s && a1!=x.a/dif && a1!=x.a%dif && a2!=x.a/dif && a2!=x.a%dif)
			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=dif*i+j;
			clad(s[ct].s%bz,s[ct]);
		}
	for (i=1; i<=ct; i++)
		cauta(sm-s[i].s%bz,s[i]);
	printf("%ld",nr/6);
	fclose(stdin);
	fclose(stdout);
	return 0;
}