Cod sursa(job #1973218)

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

#define MOD 666013
#define MAXN 105

using namespace std;

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

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

void Add(unsigned 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(unsigned 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, ok = 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){
                if(ok) break;
                for(int r = 1; r <= n; ++r){
                    if(ok) break;
                    for(int t = 1; t <= n; ++t){
                        unsigned 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(s1 && s2){
                            ok = 1;
                            break;
                        }
                    }
                }
            }
        }
    }
    if(!p) g << -1 << '\n';
}