Pagini recente » Cod sursa (job #718678) | Cod sursa (job #160019) | Cod sursa (job #1382742) | Cod sursa (job #1547561) | Cod sursa (job #500500)
Cod sursa(job #500500)
#include <fstream>
#include <algorithm>
#include <list>
using namespace std;
const int MOD = 3033;
list<pair<int, int> > hash[MOD];
void Add(int value)
{
int nMOD = value % MOD;
for (list<pair<int ,int> >::iterator it = hash[nMOD].begin(); it != hash[nMOD].end(); ++it)
if (it->first == value)
{
++it->second;
return;
}
hash[nMOD].push_back(make_pair(value, 1));
}
void Del(int value)
{
int nMOD = value % MOD;
for (list<pair<int ,int> >::iterator it = hash[nMOD].begin(); it != hash[nMOD].end(); ++it)
if (it->first == value)
{
--it->second;
if (it->second == 0)
hash[nMOD].erase(it);
return;
}
}
int Find(int value)
{
int nMOD = value % MOD;
for (list<pair<int ,int> >::iterator it = hash[nMOD].begin(); it != hash[nMOD].end(); ++it)
if (it->first == value)
return it->second;
return 0;
}
int N, R, V[1028];
long long result;
int main()
{
ifstream fin("oite.in");
ofstream fout("oite.out");
fin >> N >> R;
for (int i = 1; i <= N; ++i)
fin >> V[i];
sort(V, V + N);
for (int i = 3; i < N; ++i)
for (int j = i + 1; j <= N; ++j)
Add(V[i] + V[j]);
for (int i = 2; i <= N; ++i)
{
for (int j = i - 1; j >= 1; --j)
result += Find(R - V[i] - V[j]);
// Le scot toate cu i + 1 (V[i + 1] + V[k], k <= i sunt scoase)
for (int j = i + 2; j <= N; ++j)
Del(V[i + 1] + V[j]);
}
fout << result;
}