Подсчет подпоследовательностей с НОД, равным X
Опубликовано: 21 Сентября, 2022
Дан массив arr[] , состоящий из N целых чисел и положительного целого числа X , задача состоит в том, чтобы подсчитать подпоследовательности с НОД ровно X .
Примеры:
Input: arr[] = {6, 4, 30} X = 2
Output: 3
Explanation: Subsequences with GCD(=2) are { {6, 4, 30}, {4, 30}, {6, 4} }. Hence, 3 is the answer.Input: arr[] = {6, 6, 6} X = 3
Output: 0
Подход: Данную проблему можно решить с помощью динамического программирования. Выполните следующие шаги, чтобы решить данную проблему.
- Определите двумерную таблицу dp dp[i][j] , которая будет обозначать количество допустимых подпоследовательностей до индекса i с GCD(= j ).
- Для каждой итерации у нас есть 2 варианта:
- Возьмем текущий элемент: таблицу dp можно обновить как dp[i + 1][gcd(j, arr[i])] += dp[i][j] .
- Пропустить текущий элемент: таблица dp может быть обновлена как dp[i+1][j] += dp[i][j] .
- Базовый случай: dp[0][0] = 1 .
- Поскольку НОД двух чисел никогда не может быть больше двух чисел, поэтому значения j будут равны максимальному элементу в массиве. Следовательно, его можно решить итеративно, и окончательный ответ будет dp[N][X] .
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O(N*M), где M — максимальный элемент массива .
Вспомогательное пространство: O(N*M)