Cod sursa(job #1333103)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 2 februarie 2015 20:02:21
Problema Loto Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#define NIL -1
#define MASK 8388607 //(1<<23)-1
#define MAXN 100
int v[MAXN];
int next[MAXN*MAXN*MAXN];
int lista[MASK+1];
int main(){
    int n, s, i, j, k, f, x, p;
    FILE *fin, *fout;
    fin=fopen("loto.in", "r");
    fout=fopen("loto.out", "w");
    fscanf(fin, "%d%d", &n, &s);
    for(i=0; i<n; i++){
        fscanf(fin, "%d", &v[i]);
    }
    for(i=0; i<=MASK; i++){
        lista[i]=NIL;
    }
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            for(k=0; k<n; k++){
                next[n*n*i+n*j+k]=lista[(v[i]+v[j]+v[k])&MASK];
                lista[(v[i]+v[j]+v[k])&MASK]=n*n*i+n*j+k;
            }
        }
    }
    f=0;
    for(i=0; (i<n)&&(f==0); i++){
        for(j=0; (j<n)&&(f==0); j++){
            for(k=0; (k<n)&&(f==0); k++){
                x=s-v[i]-v[j]-v[k];
                p=lista[x&MASK];
                while((p!=NIL)&&(f==0)){
                    if(x==v[p/(n*n)]+v[(p/n)%n]+v[p%n]){
                        fprintf(fout, "%d %d %d %d %d %d\n", v[i], v[j], v[k], v[p/(n*n)], v[(p/n)%n], v[p%n]);
                        f=1;
                    }
                    p=next[p];
                }
            }
        }
    }
    if(f==0){
        fprintf(fout, "-1\n");
    }
    fclose(fin);
    fclose(fout);
    return 0;
}