Pagini recente » Cod sursa (job #2399298) | Cod sursa (job #1850684) | Cod sursa (job #764660) | Cod sursa (job #2812593) | Cod sursa (job #416214)
Cod sursa(job #416214)
#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];
if (t<=m)
{
rest=t-(t/MOD*MOD);
B[++r].a=t; B[r].b=i; B[r].c=j;
C[rest].push_back(r);
}
}
}
void get_size()
{
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-(t/MOD*MOD);
for (k=0; k<L[rest]; k++)
{
s=C[rest][k];
if (B[s].a==t)
if (B[s].b>j)
rez++;
}
}
}
}
}
int main()
{
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
read();
precompute();
get_size();
solve();
printf("%lld\n",rez);
return 0;
}