Cod sursa(job #694381)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 27 februarie 2012 20:35:04
Problema Oite Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define MOD 676513
#define Nmax 1025
#define pb push_back
#define mp make_pair
#define s first
#define x1 second.first
#define x2 second.second

using namespace std;

int j,n,S,i,sol,a[Nmax];
vector<pair<int,pair<int,int> > > H[Nmax];
vector<pair<int,pair<int,int> > >::iterator it;

void insert(int x)
{
	H[x%MOD].pb(mp(x,mp(i,j)));
}

int OK(pair<int,pair<int,int> > X,int i,int j,int x)
{
	if (X.s!=x) return 0;
	if (X.x1==i) return 0;
	if (X.x2==i) return 0;
	if (X.x1==j) return 0;
	if (X.x2==j) return 0;
	return 1;
}


void search(int x)
{
	for (it=H[x%MOD].begin();it!=H[x%MOD].end();it++)
		if (OK(*it,i,j,x)) 
			sol++;
}

int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	
	scanf("%d%d",&n,&S);
	
	for (i=1;i<=n;i++)
		scanf("%d",&a[i]);
	
	for (i=1;i<=n;i++)
		for (j=i+1;j<=n;j++)
			if (i!=j) insert(a[i]+a[j]);
	for (i=1;i<=n;i++)
		for (j=i+1;j<=n;j++)
			if (i!=j) search(S-a[i]-a[j]);
		
	printf("%d\n",sol/6);
}