📌  相关文章
📜  具有最大不同质因子数的 K 长度子数组的最大和(1)

📅  最后修改于: 2023-12-03 14:50:07.320000             🧑  作者: Mango

【算法题解】具有最大不同质因子数的 K 长度子数组的最大和

题目描述

给定一个长度为 $n$ 的整数数组 $a$ 和一个长度为 $k$ 的整数数组 $b$,其中 $b$ 中所有元素互不相同。定义 $a$ 的一个长度为 $k$ 的子数组 $a_{i, j}$ 为 ${ a_i, a_{i+1}, ..., a_j }$。对于每个子数组 $a_{i, i+k-1}$,记其不同质因子的数量为 $f(a_{i, i+k-1})$,求所有子数组不同质因子的数量之和的最大值。

示例

输入:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [2, 3]

输出:

8

解释:$a$ 的子数组和它们的不同质因子数量如下:

| 子数组 | 和 | 不同质因子数 | |:-:|:-:|:-:| | $[1,2]$ | $3$ | $1$ | | $[2,3]$ | $5$ | $2$ | | $[3,4]$ | $7$ | $1$ | | $[4,5]$ | $9$ | $2$ | | $[5,6]$ | $11$ | $1$ | | $[6,7]$ | $13$ | $1$ | | $[7,8]$ | $15$ | $2$ | | $[8,9]$ | $17$ | $1$ | | $[9,10]$ | $19$ | $2$ |

子数组 $[2,3]$ 和 $[7,8]$ 的不同质因子数量都是 $2$,其他子数组的不同质因子数量都不超过 $1$,所以答案是 $2+2+2+2 = 8$。

解题思路

我们可以枚举 $a$ 的所有长度为 $k$ 的子数组,然后逐一计算它们的不同质因子数量,最终累加得到答案。但这样的时间复杂度是 $O(n k^2 \log \max a_i)$,显然无法通过此题。

观察题目,不难发现一个非常有用的性质:对于任意两个长度为 $k$ 的子数组 $a_{i, i+k-1}$ 和 $a_{j, j+k-1}$,它们共用了 $k-1$ 个数字,只有第一个和最后一个数字不同。因此,如果我们预处理出 $a$ 的所有长度为 $k-1$ 的子数组的不同质因子数量,那么对于两个长度为 $k$ 的子数组 $a_{i, i+k-1}$ 和 $a_{i+1, i+k}$,它们的不同质因子数量可以快速计算:

$$ f(a_{i+1, i+k}) = f(a_{i, i+k-1}) + D(a_{i+k}), $$

其中 $D(x)$ 表示 $x$ 中不同质因子的数量。我们可以通过线性筛预处理出 $1$ 到 $\max a_i$ 之间每个数字的质因子信息,然后对 $a$ 进行一次遍历即可求出所有长度为 $k$ 的子数组的不同质因子数量。

在每个长度为 $k$ 的子数组上求和,即可得到答案。时间复杂度 $O(n \log \max a_i + n k)$,可以通过此题。

代码实现

下面是 Python 代码实现: