Pagini recente » Cod sursa (job #2825022) | Cod sursa (job #391970) | Cod sursa (job #344309) | Cod sursa (job #2745775) | Cod sursa (job #416017)
Cod sursa(job #416017)
#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,L[MOD];
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 get_length()
{
int i;
for (i=0; i<MOD; i++)
L[i]=C[i].size();
}
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<L[rest]; 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++;
}
}
t=A[i]+A[j];
rest=t%MOD;
for (k=0; k<C[rest].size(); k++)
{
s=C[rest][k];
if (B[s].a==t && B[s].b==i && B[s].c==j)
{
if (L[rest]>1)
C[rest][k]=C[rest][L[rest]-1];
L[rest]--;
break ;
}
}
}
}
int main()
{
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
read();
precompute();
get_length();
solve();
printf("%lld\n",rez/3);
return 0;
}