Подсчет последовательности длины K в диапазоне [1, N], где каждый элемент кратен предыдущему

Опубликовано: 20 Сентября, 2022

Даны два целых числа N и K. Задача состоит в том, чтобы найти количество последовательностей из K элементов из диапазона [1, N], где каждый элемент кратен предыдущему элементу.

Пример:

Input: N = 4, K = 3 
Output: 13
Explanation: The sequences that can be made from the integers 1, 2, 3, 4 having 3 elements are: {1, 1, 1}, {2, 2, 2}, {3, 3, 3}, {4, 4, 4}, {1, 1, 2}, {1, 2, 2}, {1, 2, 4}, {1, 1, 3}, {1, 3, 3}, {1, 1, 4}, {1, 4, 4}, {2, 2, 4}, and {2, 4, 4}.

Input: N = 9, K = 5 
Output: 111

Подход: Данную задачу можно решить с помощью рекурсии с запоминанием. Выполните следующие шаги, чтобы решить проблему:

  • Создайте двумерный массив dp[][] , в котором хранятся запомненные состояния, где dp[i][j] представляет количество последовательностей длины i , имеющих j в качестве первого элемента.
  • Создайте рекурсивную функцию countSequenceUtil() , которая принимает длину последовательности и начальный элемент в качестве аргументов, устанавливает следующий элемент как кратное текущему элементу и рекурсивно вызывает оставшуюся последовательность.
  • Сохраняем ответ для рассчитанных состояний в массиве dp[][] и если для какого-то состояния значение уже рассчитано, возвращаем его.
  • Создайте функцию countSequence() , которая перебирает все возможные начальные элементы последовательности и вызывает рекурсивную функцию для вычисления последовательностей из K элементов с этим начальным элементом.
  • Сохраните сумму рассчитанного количества для каждого начального элемента в переменной , которая является требуемым значением.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N*K*log N)
Вспомогательное пространство: O(N*K)