Найти длиннейшую геометрическую прогрессию среди делителей заданного числа

  • дано целое число M>1
  • оно порождает последовательность MM=[1, ..., M], где любое MM(i) - делитель M
    • например, M=600 -> MM=[1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 25, 30, 40, 50, 60, 75, 100, 120, 150, 200, 300, 600]
  • найти самую длинную геометрическую последовательность SS, которая может быть сгенерирована с помощью пары чисел P,F, где P принадлежит MM, F - целое, SS(i)=P*(F^i) и SS(i) принадлежит MM
    • например, P=1,F=2 порождает SS=[1, 2, 4, 8] (16 уже не принадлежит MM)
  • для двух пар, генерирующих последовательность одинаковой длины, предпочтение отдаётся меньшему P, а при совпадении P - меньшему F

У меня есть алгоритм, который перебирает P from 1 to MM(-1), F in primes from 2 to sqrt(M)

Теперь вопросы

  • интуитивно кажется, что F - это всегда простое число, прав/не прав?
  • есть идеи на счёт оптимизации?
    • Например, можно ли как-то использовать разложение M на множители (2*2*2*3*5*5)?

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

"P*(F^i) принадлежит MM" означает что M делится на P*(F^i). Но тогда M делится и на F^i. Откуда следует что для любой пары (P, F) пара (1, F) даёт последовательность той же длины или длиннее.

Вы правильно решили что F должно быть простым. Если оно составное, то любой его делитель даёт последовательность не короче.

Тогда решением будет пара (1, F), где F простой делитель M входящий в разложение M на простые с наибольшей степенью.

M = 600 = 2^3 * 3^1 * 5^2. Надо выбрать F = 2. Длина последовательности будет равна степени простого плюс один.

P.S. Условия допускают F = 1 что делает задачу бессмысленной.

→ Ссылка