Cod sursa(job #808788)

Utilizator BalcauIonutFMI-Balcau Ionut BalcauIonut Data 7 noiembrie 2012 11:53:01
Problema Loto Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<vector>
#include<fstream>
#define P 666013
using namespace std;


vector<int> h[P];
vector<int> sum;
vector<int>::iterator find(int x){
	int r=x%P;
	vector<int>::iterator it;
	for(it=h[r].begin();it!=h[r].end();++it)
		if(*it==x) return it;
	return h[r].end();
}
		
void push(int x){
	int r=x%P;
	if(find(x)==h[r].end()){
			h[r].push_back(x);
			sum.push_back(x);
	}
}

/*
void pop(int x){
	int r=x%P;
	vector<int>::iterator it=find(x);
	if(it!=h[r].end()) h[r].erase(it);
} */


int main(){
	int a[200],s,i,j,k,n,s1,s2;
	
	ifstream fin("loto.in");
	ofstream fout("loto.out");
	fin>>n>>s;
	for(i=1;i<=n;++i)
		fin>>a[i];
	fin.close();
	for(i=1;i<=n;++i)
		for(j=i;j<=n;++j)
			for(k=j;k<=n;++k)
				push(a[i]+a[j]+a[k]);
			
	vector<int>::iterator it;
	bool ok=0;
	for(it=sum.begin();it!=sum.end();++it)
		if(find(s-*it)!=h[(s-*it)%P].end()){
			s1=*it; s2=s-*it; ok=1;
		
			bool ok1=1;
		for(i=1;i<=n&&ok1;++i)
			for(j=i;j<=n&&ok1;++j)
				for(k=j;k<=n&&ok1;++k)
					if(a[i]+a[j]+a[k]==s1) {ok1=0; fout<<a[i]<<' '<<a[j]<<' '<<a[k]<<' ';
					}
			ok1=1;
		for(i=1;i<=n&&ok1;++i)
			for(j=i;j<=n&&ok1;++j)
				for(k=j;k<=n&&ok1;++k)
					if(a[i]+a[j]+a[k]==s2){ok1=0; fout<<a[i]<<' '<<a[j]<<' '<<a[k];
					}
		return 0;
		}
	if(!ok) fout<<-1;
	return 0;
}