找到以 K 为因子的最小长度区间

Posted

技术标签:

【中文标题】找到以 K 为因子的最小长度区间【英文标题】:Find minimum length interval that has K as its factor 【发布时间】:2015-11-08 17:42:31 【问题描述】:

给定一个整数 K 和一个包含 N 个整数的列表。我们需要在列表中找到所有可能的最短区间,使得每个区间的整数乘积是K的倍数。

示例:设 N=6, K=5 且数组为 [2,9,4,3,16],则此处的最小区间长度为 2,其乘积为 K 的倍数。

间隔:[1, 2] , [2, 3] , [3, 4] , [4, 5]。

现在我需要找到最小长度和所有间隔的开始和结束。

但问题是约束很大,1≤N≤2×10^5,1≤K≤10^17,数组元素最多为10^15。

【问题讨论】:

您显然缺少一些信息/约束。假设 k=8 并且数组中的所有数字都是 2。那么任何 3 个组合(2*2*2)都可以工作,打印它们至少需要 O(n^3) 时间,这将超时。也许整数是唯一的? 您的列表中没有一个整数是 K = 5 的倍数——那么您如何获得该列表的子区间,其乘积是 5 的倍数? 我认为这只是一个不好的例子。如果 K 是素数,则它必须出现在列表中,并且最小长度间隔的长度为 1。如果 K 为 9,那么两个连续的 3 将为您提供一个间隔。 【参考方案1】:

您可以使用分段树来计算product(a[i...j])%K 中的O(log N)

根据如果product(a[i...j])%K==0,则product(a[i...j+k])%K==0的原理,可以对每个i进行二分查找,找到第一个j,其中product(a[i..j])%K==0

在第一遍中,找出最小长度。然后再查找并打印i 的长度。

那是O(n log^2 n)。对于 2*10^5 应该足够了。特别给出的答案可以有 O(n^2) 项(例如 n/2 个子数组,每个子数组有 n/2 个项)。

【讨论】:

以上是关于找到以 K 为因子的最小长度区间的主要内容,如果未能解决你的问题,请参考以下文章

如何找到最小 L 使得长度为 L 的 k 个给定段可以覆盖 n 个给定点?

区间 dp

Copying Books

滑动窗口

hdu5696 区间的价值

最长k可重区间集问题