1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import sys

# Wczytywanie wejścia
n, s = map(int, sys.stdin.readline().split())
B = set(map(int, sys.stdin.readline().split()))

# Tworzenie zbiorów podstawowych A1, ..., An
A = [set() for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(i, n + 1, i):
        A[i].add(j)

# Jeśli B już istnieje jako jeden z początkowych zbiorów
for i in range(1, n + 1):
    if A[i] == B:
        print(0)
        sys.exit(0)

# Lista operacji
operations = []
current_index = n  # Ostatni indeks zbioru

# Wybór zbiorów potrzebnych do stworzenia B
selected_sets = []
for i in range(1, n + 1):
    if A[i] & B:
        selected_sets.append(i)

# Budowanie zbioru B
result_set = set()
operation_map = {}  # Przypisanie numeru operacji do zbioru
for i in selected_sets:
    if not result_set:
        result_set = A[i]
        operation_map[i] = i
    else:
        current_index += 1
        result_set |= A[i]
        operations.append(f"1 {operation_map[selected_sets[0]]} {i}")
        operation_map[current_index] = current_index

# Jeśli w wyniku sumowania dodaliśmy zbędne elementy, stosujemy przecięcie
if result_set != B:
    complement = set(range(1, n + 1)) - result_set
    if complement:
        current_index += 1
        operations.append(f"3 {operation_map[selected_sets[0]]}")
        operation_map[current_index] = current_index
        result_set = complement

# Wypisanie liczby operacji i ich listy
print(len(operations))
print("\n".join(operations))