Cod sursa(job #368491)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 25 noiembrie 2009 00:11:26
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#define MAXN 101
#define DIV 666131
FILE *f = fopen("loto.in","r");
FILE *g = fopen("loto.out","w");
int n,s,v[MAXN], nr1, nr2, nr3;

struct nod{
	int x,y,z;
	nod *urm;
} *L[DIV];


void citire(){
	fscanf(f, "%d %d", &n, &s);
	for (int i = 1; i <= n; i++)
		fscanf(f,"%d", &v[i]);
	fclose(f);
}

void add(int i, int j, int k){
	int ind = ( v[i] + v[j] + v[k] ) % DIV;
	nod *p = new nod;
	p->x = i;
	p->y = j;
	p->z = k;
	p->urm = L[ind];
	L[ind] = p;
}

int check (int x){
	for (nod *p = L[x % DIV]; p != NULL; p = p->urm)
		if (v[p -> x] + v[p -> y] + v[p -> z] == x){
			nr1 = v[p->x];
			nr2 = v[p->y];
			nr3 = v[p->z];
			return 1;
		};
	return 0;
};

int main (){
	citire();
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 1; k <= n; k++)
				add(i, j, k);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 1; k <= n; k++)
				if (check(s - (v[i] + v[j] + v[k]))){
					fprintf(g,"%d %d %d %d %d %d", i, j, k, nr1, nr2, nr3);
					return 0;
				};
	fprintf(g,"-1");
	fclose(g);
	return 0;
}