Pagini recente » Cod sursa (job #2151650) | Cod sursa (job #622271) | Cod sursa (job #2848617) | Cod sursa (job #1333843) | Cod sursa (job #1514257)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MAXN 128
#define MOD 666013
#define mask 255
struct hash_line
{
int idx;
struct hash_line *link;
} *Hash[MOD];
int N, S, A[MAXN];
inline struct hash_line *find(int no1, int no2, int no3)
{
int sum = A[no1] + A[no2] + A[no3], key, req = S - sum;
struct hash_line *it;
key = req % MOD;
if (key < 0) key *= -1;
for (it = Hash[key]; it; it = it->link)
if (A[it->idx & mask] + A[it->idx >> 8 & mask] + A[it->idx >> 16] == req)
return it;
key = sum % MOD;
if (key < 0) key *= -1;
struct hash_line *New = malloc(sizeof(struct hash_line));
New->idx = no1 | (no2 << 8) | (no3 << 16);
New->link = Hash[key];
Hash[key] = New;
return 0;
}
int main()
{
assert(freopen("loto.in", "r", stdin));
freopen("loto.out", "w", stdout);
// local variables
int i, j, k;
struct hash_line *now;
scanf("%d %d", &N, &S);
for (i = 0; i < N; ++i){
scanf("%d", &A[i]);
if (6 * A[i] == S)
{
//for (j = 0; j < 6; ++j)
// printf("%d ", A[i]);
// return 0;
}
}
for (i = 0; i < N; ++i)
for (j = 0; j < N; ++j)
for (k = 0; k < N; ++k)
{
now = find(i, j, k);
if (!now) continue;
printf("%d %d %d %d %d %d", A[i], A[j], A[k], A[now->idx & mask], A[now->idx >> 8 &mask], A[now->idx >> 16]);
return 0;
}
--N;
now = find(N, N, N);
!now ? puts("-1") : printf("%d %d %d %d %d %d", A[N], A[N], A[N], A[N], A[N], A[N]);
puts("-1");
return 0;
}