Cod sursa(job #416001)

Utilizator indestructiblecont de teste indestructible Data 12 martie 2010 01:07:10
Problema Oite Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define NMAX 1035
#define LMAX (1<<20)+1
#define MOD1 100007
#define MOD2 100021
#define ll long long
using namespace std;
int n,m,A[NMAX],r;
struct suma
{
	int a,b,c;
};
suma B[LMAX];
vector <int> C[MOD1],D[MOD2];
ll rez;
void read()
{
	scanf("%d%d",&n,&m);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
	sort(A+1,A+n+1);
}
void precompute()
{
	int i,j,t,rest1,rest2;
	for (i=1; i<=n; i++)
		for (j=i+1; j<=n; j++)
		{
			t=A[i]+A[j];
			rest1=t%MOD1;
			rest2=t%MOD2;
			B[++r].a=t; B[r].b=i; B[r].c=j;
			C[rest1].push_back(r);
			D[rest2].push_back(r);
		}
}
void solve()
{
	int i,j,t,s,rest1,rest2,k;
	for (i=1; i<=n; i++)
		for (j=i+1; j<=n; j++)
		{
			t=A[i]+A[j];
			if (t<=m)
			{
				t=m-t;
				rest1=t%MOD1;
				rest2=t%MOD2;
				if (C[rest1].size()<D[rest2].size())
					for (k=0; k<C[rest1].size(); k++)
					{
						s=C[rest1][k];
						if (B[s].a==t)
							if (B[s].b!=i && B[s].b!=j && B[s].c!=i && B[s].c!=j)
								rez++;
					}
				else
					for (k=0; k<D[rest2].size(); k++)
					{
						s=D[rest2][k];
						if (B[s].a==t)
							if (B[s].b!=i && B[s].b!=j && B[s].c!=i && B[s].c!=j)
								rez++;
					}
			}
			else
				break ;
		}
}
int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	read();
	precompute();
	solve();
	rez/=6;
	printf("%lld\n",rez);
	return 0;
}