Cod sursa(job #1973197)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 24 aprilie 2017 19:28:40
Problema Loto Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <vector>

#define MOD 666013
#define MAXN 105

using namespace std;

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

int n, s, v[MAXN];
int sum[MAXN * MAXN * MAXN];
vector < int > h[MOD];

void Add(int x){
    int p = 0;
    for(int i = 0; i < h[x % MOD].size(); ++i){
        if(h[x % MOD][i] == x){
            p = 1;
            break;
        }
    }
    if(!p) h[x % MOD].push_back(x);
}
int Find(int x){
    for(int i = 0; i < h[x % MOD].size(); ++i){
        if(h[x % MOD][i] == x) return 1;
    }
    return 0;
}

int main(){
    f >> n >> s;
    for(int i = 1; i <= n; ++i) f >> v[i];

    int l = 0;
    for(int k = 1; k <= n; ++k){
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= n; ++j){
                sum[++l] = v[k] + v[i] + v[j];
                Add(sum[l]);
            }
        }
    }
    int p = 0;
    int s1 = 0, s2 = 0;
    for(int i = 1; i <= l; ++i){
        if(Find(s - sum[i])){
            p = 1;
            for(int q = 1; q <= n; ++q){
                for(int r = 1; r <= n; ++r){
                    for(int t = 1; t <= n; ++t){
                        int S = v[q] + v[r] + v[t];
                        if(S == sum[i] && !s1){
                            s1 = 1;
                            g << v[q] << ' ' << v[r] << ' ' << v[t] << ' ';
                        }
                        else if(S == s - sum[i] && !s2){
                            s2 = 1;
                            g << v[q] << ' ' << v[r] << ' ' << v[t] << ' ';
                        }
                    }
                }
            }
        }
    }
    if(!p) g << -1 << '\n';
}