Для решения задачи можно использовать подход динамического программирования.
1. Создадим два списка: `color1` и `color2`, инициализированные нулями длины `n`. Эти списки будут хранить цвета, которыми будут раскрашены элементы массива.
2. Создадим словарь `prev` для хранения информации о предыдущем элементе. Ключами в словаре будут пары `(x, y)`, где `x` и `y` – числа из массива, значение – кортеж `(i, j)`, где `i` и `j` – индексы этих чисел в массиве `A`. Этот словарь поможет нам восстановить путь назад и определить, какие числа выбрать.
3. Пройдемся циклом по всем парам чисел `(x, y)` в массиве `A`. Для каждой пары чисел будем проверять, выполняется ли условие `x/y = p`, где `p` – простое число. Если условие выполняется, то установим соответствующие цвета элементов `x` и `y` равными 1 и -1 (или наоборот).
4. Проверим, является ли число `x/y` целым числом. Если да, то применим следующую проверку: если `color1[i] == color1[j]` или `color2[i] == color2[j]`, то установим соответствующие цвета элементов `x` и `y` равными 1 и -1 (или наоборот).
5. В конце цикла определим, какие элементы остались без раскраски, и сделаем один из них цветом 1, а остальные цветами -1.
6. Восстановим путь назад, используя словарь `prev`, чтобы определить, какие числа были раскрашены в какой цвет.
7. Выведем результат раскраски массива.
Пример кода на языке Python:
“`python
import math
n = int(input())
A = list(map(int, input().split()))
color1 = [0] * n
color2 = [0] * n
prev = {}
for i in range(n):
for j in range(i):
x = A[i]
y = A[j]
if x % y == 0:
color1[i] = 1
color2[j] = 1
prev[(x, y)] = (i, j)
elif y % x == 0:
color1[j] = 1
color2[i] = 1
prev[(y, x)] = (j, i)
elif math.gcd(x, y) == 1:
if color1[i] == color1[j] or color2[i] == color2[j]:
color1[i] = 1
color2[j] = 1
prev[(x, y)] = (i, j)
else:
color1[j] = 1
color2[i] = 1
prev[(y, x)] = (j, i)
# Определение не раскрашенных элементов массива
uncolored = []
for i in range(n):
if color1[i] == 0 and color2[i] == 0:
uncolored.append(i)
# Раскраска элементов
color = 1
for i in uncolored:
color1[i] = color
color *= -1
# Восстановление пути
for pair, indices in prev.items():
x, y = pair
i, j = indices
if color1[i] == 0 and color2[i] == 0:
color1[i] = -color1[j]
if color1[j] == 0 and color2[j] == 0:
color1[j] = -color1[i]
# Вывод результатов
for c in color1:
print(c, end=’ ‘)
“`
Время работы алгоритма – O(n²), так как мы проходим два вложенных цикла для каждого элемента массива `A`.