Cod sursa(job #415990)

Utilizator indestructiblecont de teste indestructible Data 12 martie 2010 00:59:27
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define NMAX 1035
#define LMAX (1<<20)+1
#define MOD 666013
#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[MOD];
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,rest;
	for (i=1; i<=n; i++)
		for (j=i+1; j<=n; j++)
		{
			t=A[i]+A[j];
			rest=t%MOD;
			B[++r].a=t; B[r].b=i; B[r].c=j;
			C[rest].push_back(r);
		}
}
void solve()
{
	int i,j,t,s,rest,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;
				rest=t%MOD;
				for (k=0; k<C[rest].size(); k++)
				{
					s=C[rest][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;
}