Вступление
В этой задаче мы будем иметь дело с неким бесконечным неориентированным графом, который я называю графом с высокими делителями . Его узлами являются целые числа, начиная с 2. Между двумя узлами a <b есть ребро, если a делит b и a 2 ≥ b . Подграф, образованный диапазоном от 2 до 18, выглядит так:
16-8 12 18
\|/ |/|
4 6 9 10 15 14
| |/ |/ |
2 3 5 7 11 13 17
Можно показать, что бесконечный граф с высокими делителями связан, поэтому мы можем спросить о кратчайшем пути между двумя узлами.
Вход и выход
Ваши входные данные - два целых числа a и b . Можно предположить, что 2 ≤ a ≤ b <1000 . Ваш вывод - длина кратчайшего пути между a и b в бесконечном графе высокого делителя. Это означает количество ребер в пути.
Может оказаться полезным следующий факт: всегда существует оптимальный путь от а до б который сначала увеличивается, а затем уменьшается, и посещает только те узлы, которые строго меньше 2b 2 . В частности, поскольку b <1000, вам нужно учитывать только узлы менее 2 000 000.
Примеры
Рассмотрим входы 3
и 32
. Одним из возможных путей между узлами 3 и 32 является
3 -- 6 -- 12 -- 96 -- 32
Этот путь имеет четыре ребра, и оказывается, что нет более коротких путей, поэтому правильный вывод 4
.
В качестве другого примера, оптимальный путь 2
и25
является
2 -- 4 -- 8 -- 40 -- 200 -- 25
поэтому правильный вывод 5
. В этом случае ни один оптимальный путь не содержит узел 50 = lcm(2, 25)
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Нет ограничений по времени или памяти, поэтому грубое принуждение разрешено.
Контрольные примеры
2 2 -> 0
2 3 -> 4
2 4 -> 1
2 5 -> 5
3 5 -> 4
6 8 -> 2
8 16 -> 1
12 16 -> 2
16 16 -> 0
2 25 -> 5
3 32 -> 4
2 256 -> 3
60 77 -> 3
56 155 -> 3
339 540 -> 2
6 966 -> 4
7 966 -> 2
11 966 -> 4
2 997 -> 7
991 997 -> 4
FindShortestPath
нарушает ограничение на стандартные лазейки? Если это так, просто дайте мне знать, и я удалю свою заявку.