Подсчитайте N-значные числа, у которых соседние цифры имеют равный НОД

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

Для данного положительного целого числа N задача состоит в том, чтобы найти количество всех N -значных чисел, соседние цифры которых имеют одинаковый наибольший общий делитель (НОД).

Примеры:

Input: N = 2
Output: 90
Explanation:
All 2-digit numbers satisfy the condition as there is only one pair of digits and there are 90 2-digit numbers.

Input: N = 3
Output: 457

Наивный подход: Самый простой подход к решению данной задачи состоит в том, чтобы сгенерировать все возможные N-значные числа и подсчитать те числа, соседние цифры которых имеют одинаковый НОД. После проверки всех чисел выведите значение count как результирующее общее количество чисел.

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

Эффективный подход. Описанный выше подход также можно оптимизировать с помощью динамического программирования, поскольку в приведенной выше задаче есть перекрывающиеся подзадачи и оптимальная подструктура. Подзадачи могут быть сохранены в мемоизации таблицы dp[][][], где dp[index][prev][gcd] хранит ответ с позиции index th до конца, где prev используется для хранения предыдущей цифры числа gcd — это НОД между существующими соседними цифрами в номере. Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте глобальный многомерный массив dp[100][10][10] со всеми значениями как -1 , в котором хранится результат каждого рекурсивного вызова.
  • Определите рекурсивную функцию, скажем, countOfNumbers(index, prev, gcd, N) и выполните следующие шаги:
    • Если значение индекса равно (N + 1) , то вернуть 1 , так как сформировано действительное N -значное число.
    • Если результат состояния dp[index][prev][gcd] уже вычислен, верните это значение dp[index][prev][gcd] .
    • Если текущий индекс равен 1 , то можно поставить любую цифру из [1-9] .
    • Если текущий индекс больше 1 , можно поместить любую цифру от [0-9] .
    • Если индекс больше 2 , можно поставить цифру, если НОД текущей цифры и предыдущей цифры равен НОД уже существующих соседних цифр.
    • После правильного размещения цифр рекурсивно вызовите функцию countOfNumbers для (index + 1) .
    • Верните сумму всех возможных правильных размещений цифр в качестве ответа.
  • В качестве результата выведите значение, возвращаемое функцией countOfNumbers(1, 0, 0, N) .

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

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