Cod sursa(job #33032)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 18 martie 2007 20:39:41
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>

using namespace std;

typedef long long lint;

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define nmax 1024
#define lmax 1048576
#define Hmax 666013
#define mask 1048575
#define f(x) ((x%Hmax))

void Add(int x,int vB[],int urmB[],int nrB[],int B[],int &zB)
{
	int H=f(x),i;//((x&mask)*103)&mask,i;
	if(!vB[H])
	{
		vB[H]=++zB;
		urmB[zB]=0;
		nrB[zB]=x;
		B[zB]=1;
		return;
	}
	for(i=vB[H];nrB[i]!=x&&urmB[i];i=urmB[i]);
	if(nrB[i]==x)
	{
		B[i]++;
		return ;
	}
	urmB[i]=++zB;
	nrB[zB]=x;
	B[zB]=1;
	urmB[zB]=0;
}

int find(int x,int vB[],int urmB[],int nrB[],int B[])
{
	int H=f(x),i;//((x&mask)*103)&mask,i;
	for(i=vB[H];i;i=urmB[i])
		if(nrB[i]==x)
			return B[i];
	return 0;
}

int n,S,A[nmax];
int urmB[nmax],nrB[nmax],vB[Hmax],zB,B[nmax];
lint sol;

int main()
{
	FILE *fi=fopen("oite.in","r"),*fo=fopen("oite.out","w");
	fscanf(fi,"%d %d",&n,&S);
	int i,j,x,k;


	FOR(i,0,n)
		fscanf(fi,"%d",&A[i]),Add(A[i],vB,urmB,nrB,B,zB);
	fclose(fi);

	sort(A,A+n);

	FOR(i,0,n) FOR(j,i+1,n)
	{		
		x=S-(A[i]+A[j]);
		if(x<0)
			continue;
		FOR(k,j+1,n)
		{
			x-=A[k];
			if(x<0)
				break;
			sol+=find(x,vB,urmB,nrB,B);
			if(A[i]==x)
				sol--;
			if(A[j]==x)
				sol--;
			if(A[k]==x)
				sol--;
			x+=A[k];
		}
	}		
	printf("%lld\n",sol);	
	fprintf(fo,"%lld\n",sol/4);	
	fclose(fo);
	return 0;
}