Pagini recente » Cod sursa (job #774329) | Cod sursa (job #141047) | Cod sursa (job #864488) | Cod sursa (job #2880504) | Cod sursa (job #3188175)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("oite.in");
ofstream cout ("oite.out");
class HashTable {
private:
const int mod = 666013;
struct Nod {
int valoare , aparitii;
Nod *urmatorul;
} *liste[666013] = { };
public:
void Add (const int valoare)
{
const int indice = valoare % mod;
for (Nod *nod_actual = liste[indice] ; nod_actual != NULL ; nod_actual = nod_actual -> urmatorul)
{ if (nod_actual -> valoare == valoare) { nod_actual -> aparitii++; return; } }
Nod *nod_actual = new Nod;
nod_actual -> valoare = valoare;
nod_actual -> aparitii = 1;
nod_actual -> urmatorul = liste[indice];
liste[indice] = nod_actual;
}
int Find (const int valoare)
{
const int indice = valoare % mod;
for (Nod *nod_actual = liste[indice] ; nod_actual != NULL ; nod_actual = nod_actual -> urmatorul)
{ if (nod_actual -> valoare == valoare) { return nod_actual -> aparitii; } }
return 0;
}
} aparitii;
int main ()
{
int lungime , suma;
cin >> lungime >> suma;
int termen[1024];
for (int indice = 0 ; indice < lungime ; indice++)
{ cin >> termen[indice]; }
sort(termen , termen + lungime);
long long modalitati = 0;
for (int indice_1 = 2 ; indice_1 < lungime - 1 ; indice_1++) {
for (int indice_2 = 0 ; indice_2 < indice_1 - 1 ; indice_2++)
{ aparitii.Add(termen[indice_2] + termen[indice_1 - 1]); }
for (int indice_2 = indice_1 + 1 ; indice_2 < lungime && termen[0] + termen[1] + termen[indice_1] + termen[indice_2] <= suma ; indice_2++)
{ modalitati += aparitii.Find(suma - termen[indice_1] - termen[indice_2]); }
}
cout << modalitati;
cout.close(); cin.close();
return 0;
}