Cod sursa(job #1763341)

Utilizator BarbumateiBarbu Matei Barbumatei Data 24 septembrie 2016 13:11:37
Problema Loto Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100
#define MOD (1<<23)-1
#define h(x) (x&MOD)
#define cube(y) (y*y*y)
int v[MAXN], lista[MOD+1], next[cube(MAXN)], ok=1;
int main(){
  int n, i, j, k, s, hash, x, poz;
  FILE *fin, *fout;
  fin=fopen("loto.in", "r");
  fout=fopen("loto.out", "w");
  fscanf(fin, "%d%d", &n, &s);
  memset(lista, -1, sizeof(lista));
  for(i=0; i<n; i++)
    fscanf(fin, "%d", &v[i]);
  for(i=0; i<n; i++)
    for(j=0; j<n; j++)
      for(k=0; k<n; k++){
        x=v[i]+v[j]+v[k]; hash=h(x);///generam hashul
        next[n*n*i+n*j+k]=lista[hash];///tinem lista inalntuita
        lista[hash]=n*n*i+n*j+k;///vectorul hash, care retine cele 3 coordonate din vect initial
      }
  for(i=0; i<n && ok; i++)
    for(j=0; j<n && ok; j++)
      for(k=0; k<n && ok; k++){
        x=s-v[i]-v[j]-v[k]; hash=h(x);
        poz=lista[hash];
        while(poz!=-1 && ok){
          if(x==v[poz/(n*n)]+v[(poz/n)%n]+v[poz%n]){
            fprintf(fout, "%d %d %d %d %d %d\n", v[poz/(n*n)], v[(poz/n)%n], v[poz%n], v[i], v[j], v[k]);
            ok=0;
          }
          poz=next[poz];
        }
      }
  if(ok)
    fprintf(fout, "-1\n");
  fclose(fin);
  fclose(fout);
    return 0;
}