Cod sursa(job #1368857)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 2 martie 2015 20:22:24
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>

using namespace std;

ifstream in("loto.in");
ofstream out("loto.out");

const int N = 201;
const int NPOW3 = 2000001;
const int MOD = 666013;

int n, s;
int v[N];
int val[NPOW3], urm[NPOW3], lst[MOD], nr = 0;

bool cauta(int);

void adauga(int x)
{
    if(cauta(x))
        return;

    int r = x % MOD;
    val[++nr] = x;
    urm[nr] = lst[r];
    lst[r] = nr;
}

bool cauta(int x)
{
    int r = x % MOD;
    for(int p = lst[r]; p; p = urm[p])
    {
        if(val[p] == x)
            return 1;
    }
    return 0;
}

int main()
{
    in >> n >> s;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            for(int k = 1; k <= n; k++)
                adauga(v[i] + v[j] + v[k]);

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            for(int k = 1; k <= n; k++)
                if(cauta(s >= v[i] + v[j] + v[k] && s - (v[i] + v[j] + v[k])))
                {
                    out << v[i] << ' ' << v[j] << ' ' << v[k] << ' ';
                    for(int i1 = 1; i1 <= n; i1++)
                        for(int j1 = 1; j1 <= n; j1++)
                            for(int k1 = 1; k1 <= n; k1++)
                                if(v[i1] + v[j1] + v[k1] == s - (v[i] + v[j] + v[k]))
                                {
                                    out << v[i1] << ' ' << v[j1] << ' ' << v[k1] << '\n';
                                    return 0;
                                }
                }
    out << -1 << '\n';
    return 0;
}