Найти длиннейшую геометрическую прогрессию среди делителей заданного числа
- дано целое число
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 шт):
"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 что делает задачу бессмысленной.