📅  最后修改于: 2023-12-03 15:11:59.348000             🧑  作者: Mango
本文将介绍如何计算一个序列中 GCD 等于 X 的子序列。GCD,即最大公约数,是指几个整数共有约数中最大的一个。
算法的基本思想是,分别计算以每个元素为结尾的子序列的 GCD,并统计 GCD 为 X 的个数。
下面是算法的核心代码实现:
def gcd_subsequences(arr, x):
n = len(arr)
dp = [0] * n # dp[i] 表示以 arr[i] 结尾的 GCD 为 x 的子序列个数
dp[0] = 1 if arr[0] == x else 0
ans = dp[0]
for i in range(1, n):
dp[i] = 1 if arr[i] == x else 0
for j in range(i - 1, -1, -1):
gcd = math.gcd(arr[j], arr[i])
if gcd == x:
dp[i] += dp[j]
ans += dp[i]
return ans
本文介绍了如何计算一个序列中 GCD 等于 X 的子序列,通过动态规划的思想,用 dp 数组记录以每个元素为结尾的子序列的 GCD,并统计 GCD 为 X 的个数。
[1] Dynamic Programming | Set 30 (Count all subsequences of length K whose sum is divisible by K) - https://www.geeksforgeeks.org/dynamic-programming-set-30-count-subsequences-length-k-sum-divisible-k/