Ctrl K

Ближайший взаимно простой предок

Сложная
Дано дерево из n узлов с номерами от 0 до n − 1, корень — узел 0. Рёбра заданы массивом links: пара [u, v] означает, что узлы u и v соединены. У каждого узла i есть метка labels[i]. Два числа **взаимно просты**, если их наибольший общий делитель равен 1. **Предки** узла — все узлы на пути от него до корня, не считая самого узла. Для каждого узла i найдите ближайшего к нему предка, метка которого взаимно проста с labels[i]. Верните массив длины n, где на позиции i стоит номер этого предка или -1, если такого нет.
Пример 1
labels=[3, 4, 9, 10], links=[[0, 1], [1, 2], [2, 3]] → [-1, 0, 1, 2]

Узел 1 (4) взаимно прост с корнем (3). Узел 2 (9) взаимно прост со своим родителем — узлом 1 (4). У узла 3 (10) и узла 2 (9) нет общих делителей, кроме 1, поэтому ответ — 2.

Пример 2
labels=[6, 2, 4, 3], links=[[0, 1], [1, 2], [0, 3]] → [-1, -1, -1, -1]

У узла 1 (2) единственный предок — корень (6), у них общий делитель 2. Узел 2 (4) имеет общий делитель 2 и с узлом 1, и с корнем. Узел 3 (3) и корень (6) делятся на 3. Поэтому ни у кого подходящего предка нет.

Пример 3
labels=[1], links=[] → [-1]
Ограничения
  • 1 ≤ n ≤ 10⁵
  • len(labels) = n
  • 1 ≤ labels[i] ≤ 50
  • len(links) = n − 1
  • 0 ≤ u, v < n, u ≠ v
  • Рёбра образуют дерево
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиДерево на равные части СложнаяПути ровно с одним простым СложнаяСамая большая группа с общими делителями СложнаяСобрать единицу СложнаяДругие порядки для того же дерева поиска Сложная
загружаем Python…
Вход
labels=[3, 4, 9, 10], links=[[0, 1], [1, 2], [2, 3]]
Ожидается
[-1, 0, 1, 2]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 26 тестов на сервере, включая скрытые.