Cod sursa(job #72173)

Utilizator blasterzMircea Dima blasterz Data 12 iulie 2007 23:34:14
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
using namespace std;
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <string>
#define r 17
#define maxn 166013
struct nod { int i, j;nod *next;};

nod *H[maxn];
int n, S;
int x[2048];

void insert(int i, int j)
{
	nod *t=new nod;
	t->i=i; t->j=j;
	int h=((x[i]+x[j]))%maxn;
	t->next=H[h];
	H[h]=t;
}

int find(int i, int j)
{
	int nr=0, sum=S-(x[i]+x[j]);
	nod *t;
	int h=((sum))%maxn;
	for(t=H[h];t;t=t->next)
		if(x[t->i]+x[t->j]==sum)
		
			if(t->i==i || t->i==j || t->j==i || t->j==j);
			else //{ printf("%d %d %d %d\n",i, j, t->i, t->j);++nr;}
			++nr;
				//if(t->i==i && t->j==j);
			//else if(t->i==j && t->j==i);
		//	else ++nr;
	return nr;
}

int main()
{
	freopen("oite.in","r",stdin);
	scanf("%d %d\n", &n, &S);
	int i, j;
//	init();

	for(i=1;i<=n;++i) scanf("%d ", x+i);
	
	for(i=1;i<n;++i)
		for(j=i+1;j<=n;++j)
			insert(i,j);
		
	
	long long nr=0;
	
	for(i=1;i<n;++i)
		for(j=i+1;j<=n;++j)
			nr+=(int)find(i, j);
		
	freopen("oite.out","w",stdout);
	printf("%lld\n", nr/6);
	return 0;
}