Cod sursa(job #3347609)

Utilizator rapidu36Victor Manz rapidu36 Data 17 martie 2026 15:29:07
Problema Loto Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define N 100
#define MOD 666019
#define NIL -1

typedef struct
{
    int val, urm;
} element;

int poz_lst[MOD], nr, x[N], n, s;
element v[N*N*N];

bool exista(int x, int cat)
{
    for (int p = poz_lst[cat]; p != NIL; p = v[p].urm)
    {
        if (v[p].val == x)
        {
            return true;
        }
    }
    return false;
}

void adauga(int x)
{
    int categorie = x % MOD;
    if (exista(x, categorie))
    {
        return;
    }
    v[nr].val = x;
    v[nr].urm = poz_lst[categorie];
    poz_lst[categorie] = nr++;
}

void sterge(int x)
{
    int categorie = x % MOD;
    int p = poz_lst[categorie];
    while (p != NIL && v[p].val != x)
    {
        p = v[p].urm;
    }
    if (p == NIL)
    {
        return;
    }
    int poz_ultim = poz_lst[categorie];
    v[p].val = v[poz_ultim].val;
    poz_lst[categorie] = v[poz_ultim].urm;
}

void afis(FILE *out, int val)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            for (int k = j; k < n; k++)
            {
                if (x[i] + x[j] + x[k] == val)
                {
                    fprintf(out, "%d %d %d\n", x[i], x[j], x[k]);
                    return;
                }
            }
        }
    }
}

int main()
{
    for (int i = 0; i < MOD; i++)
    {
        poz_lst[i] = NIL;
    }
    FILE *in, *out;
    in = fopen("loto.in", "r");
    out = fopen("loto.out", "w");
    fscanf(in, "%d%d", &n, &s);
    for (int i = 0; i < n; i++)
    {
        fscanf(in, "%d", &x[i]);
    }
    fclose(in);
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            for (int k = j; k < n; k++)
            {
                adauga(x[i] + x[j] + x[k]);
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            for (int k = j; k < n; k++)
            {
                int val = s - (x[i] + x[j] + x[k]);
                if (exista(val, val % MOD))
                {
                    fprintf(out, "%d %d %d ", x[i], x[j], x[k]);
                    afis(out, val);
                    fclose(out);
                    return 0;
                }
            }
        }
    }
    fprintf(out, "-1\n");
    fclose(out);
    return 0;
}