Cod sursa(job #3188175)

Utilizator SSKMFSS KMF SSKMF Data 2 ianuarie 2024 08:59:51
Problema Oite Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#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;
}