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

Algorithm 找到以K为因子的最小长度间隔,algorithm,Algorithm,给定一个整数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。您可以使用段树来计算产品(a[i…j])%K中的O(log N) 如果product(a[i.

给定一个整数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。

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

如果
product(a[i..j])%K==0
,那么
product(a[i..j+K])%K==0
,您可以对每个
i
,执行二进制搜索以找到第一个
j
,其中
产品(a[i..j])%K==0

在第一遍中,找出最小长度是多少。然后再进行另一次pass查找和打印,
i
具有该长度


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

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