Pagini recente » Cod sursa (job #2067834) | Cod sursa (job #895902) | Cod sursa (job #674128) | Cod sursa (job #122864) | Cod sursa (job #48791)
Cod sursa(job #48791)
using namespace std;
#include<stdio.h>
#include<vector>
#define NMAX 1024
#define LMAX 2007679
typedef struct t_v
{
int x, y;
};
void read();
void solve();
void add(int x, int y);
void rem(int x, int y);
int find(int val);
int N, A[NMAX], L;
vector<t_v> V[LMAX];
int main()
{
freopen("oite.in", "r", stdin);
freopen("oite.out", "w", stdout);
read();
solve();
return 0;
}
void read()
{
scanf("%d%d", &N, &L);
for(int i = 0; i < N; i++)
scanf("%d", A + i);
}
void solve()
{
int i, j, rez = 0;
for(i = N - 1; i >= 2; i--)
for(j = i - 1; j >= 1; j--)
add(i, j);
for(i = 1; i < N - 2; i++)
{
for(j = i + 1; j < N; j++)
rem(i, j);
for(j = i - 1; j >= 0; j--)
rez += find(L - A[i] - A[j]);
}
printf("%d\n", rez);
}
void add(int x, int y)
{
int i;
for(i = 0; i < V[(A[x] + A[y]) % LMAX].size(); i++)
if(V[(A[x] + A[y]) % LMAX][i].x == A[x] + A[y])
break;
if(i == V[(A[x] + A[y]) % LMAX].size())
{
t_v sp;
sp.x = A[x] + A[y], sp.y = 1;
V[(A[x] + A[y]) % LMAX].push_back(sp);
}
else
V[(A[x] + A[y]) % LMAX][i].y++;
}
void rem(int x, int y)
{
int i;
for(i = 0; i < V[(A[x] + A[y]) % LMAX].size(); i++)
if(V[(A[x] + A[y]) % LMAX][i].x == A[x] + A[y])
V[(A[x] + A[y]) % LMAX][i].y--;
}
int find(int val)
{
int i;
if(val < 0) return 0;
for(i = 0; i < V[val % LMAX].size(); i++)
if(V[val % LMAX][i].x == val)
return V[val % LMAX][i].y;
return 0;
}