Pagini recente » Cod sursa (job #3176394) | Cod sursa (job #2753817) | Cod sursa (job #1735227) | Cod sursa (job #2164245) | Cod sursa (job #416001)
Cod sursa(job #416001)
#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;
}