Cod sursa(job #2736792)

Utilizator Maria23Dutu Maria Maria23 Data 3 aprilie 2021 21:36:18
Problema Loto Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <tuple>
#include <utility>

using namespace std;

const int MOD = 666013;

void insert(int x, int y, int z,  vector<vector<tuple<int, int, int>>>& v)
{
    int sumaCurenta = (x + y + z) % MOD;
    bool isThere = false;
    for(auto &elem: v[sumaCurenta]) {
        if (elem == make_tuple(x, y, z))
            isThere = true;
    }
    if(!isThere)
    {
        v[sumaCurenta].push_back(make_tuple(x, y, z));
    }
}

tuple<int, int, int> find(int sum, vector<vector<tuple<int, int, int>>>& v)
{
    int sumaCurenta = sum % MOD;
    if(v[sumaCurenta].empty())
        return make_tuple(-1, -1, -1);
    return make_tuple(get<0>(v[sumaCurenta][0]), get<1>(v[sumaCurenta][0]), get<2>(v[sumaCurenta][0]));

}

int main() {
    ifstream fin("loto.in");
    ofstream fout("loto.out");

    vector<vector<tuple<int, int, int>>> hash(MOD);
    vector<int> nr;
    int N, S;
    fin>>N>>S;
    for(int i = 0; i < N; i ++){
        int x;
        fin>>x;
        nr.push_back(x);
    }
    for(int a = 0; a < N; a ++)
        for(int b = 0; b < N; b ++)
            for(int c  = 0; c < N; c ++) {
                insert(nr[a], nr[b], nr[c], hash);
            }

    bool ok = false;
    for(int d = 0; d < N; d ++)
        for(int e = 0; e < N; e ++)
            for (int f = 0; f < N; f++){
                auto result = find(S - (nr[d] + nr[e] + nr[f]), hash);
                if( result != make_tuple(-1, -1, -1)){
                    ok = true;
                    fout<<get<0>(result)<<" "
                        <<get<1>(result)<<" "
                        <<get<2>(result)<<" "
                        <<nr[d]<<" "<<nr[e]<<" "<<nr[f]<<"\n";
                    return 0;
                }
            }

    if(!ok)
        fout<<-1<<"\n";

    fin.close();
    fout.close();
    return 0;
}