Pagini recente » Cod sursa (job #85807) | Cod sursa (job #893073) | Cod sursa (job #2621138) | Cod sursa (job #2286530) | Cod sursa (job #2217014)
#include <iostream>
#include <vector>
#include <stdio.h>
#define MASK 2000000
using namespace std;
int v[1024];
int sums[MASK + 1];
int ptrToPair[1048577];
int pairval[1048577][2];
int GlobalLevel;
int main() {
//freopen("oite.in", "r", stdin);
//freopen("oite.out", "w", stdout);
int n, sum;
scanf("%d%d", &n, &sum);
for (int i = 0; i < n; i++)
scanf("%d", &v[i]);
for (int i = 0; i < n; i++) {
for (int k = i + 1; k < n; k++) {
int s = v[i] + v[k];
s = s%MASK;
GlobalLevel++;
ptrToPair[GlobalLevel] = sums[s];
sums[s] = GlobalLevel;
pairval[GlobalLevel][0] = i;
pairval[GlobalLevel][1] = k;
//sums[s].push_back(make_pair(i, k));
}
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int k = i + 1; k < n; k++) {
int s = v[i] + v[k];
//if (s > sum / 2) //Skip some unnecessary steps
//continue;
if (s > sum / 2)
continue;
int desiredSum = sum - s;
int it = sums[desiredSum%MASK];
while (it != 0) {
int v1 = pairval[it][0];
int v2 = pairval[it][1];
if (v1 != i && v2 != i && v1 != k && v2 != k) {
if (v[v1]+ v[v2] == desiredSum) //Sanity Check
cnt++;
}
it = ptrToPair[it];
}
}
}
printf("%d", cnt / 3);
}