Cod sursa(job #389292)

Utilizator Andrei200Andrei200 Andrei200 Data 1 februarie 2010 13:56:56
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define file_in "oite.in"
#define file_out "oite.out"


#define mod 666013
#define Nmax (1<<10)+3

int n,s,v[Nmax],nr;
vector<int> G[mod+10];

void add(int x)
{
	int k=x%mod;
	
	G[k].push_back(x);
}


int find(int x)
{
	vector<int> :: iterator it;
	
	int k=x%mod,cnt;
	cnt=0;
	for (it=G[k].begin();it!=G[k].end();++it)
		 if (*it==x)
			cnt++;
	return cnt;	 
		 
}

void sterge(int x)
{
	int k=x%mod;
	
	vector<int> :: iterator it;
	
	for (it=G[k].begin();it!=G[k].end();++it)
		 if (*it==x)
		 {
			 G[k].erase(it);
			 return ;
		 }
}


int main()
{
	int i,j;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &s);
	for (i=1;i<=n;++i)
	{
		scanf("%d", &v[i]);
	}
	
	sort(v+1,v+n+1);
	
	for (i=3;i<n;++i)
		 for (j=i+1;j<=n;++j)
			  add(v[i]+v[j]);
	nr=0;
	for (j=2;j<n-1;++j)
	{
		for (i=1;i<j;++i)
			 nr+=find(s-v[i]-v[j]);
		for (i=j+2;i<=n;++i)
			 sterge(v[j+1]+v[i]);
	}
	
	printf("%d\n", nr);
		 
		 
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}