在某些情况下最大化GCD

时间:2019-07-15 18:30:59

标签: java python c++ greatest-common-divisor maximize

这是hackerrank中的 HackWithInfy2019 中给出的问题。 从昨天开始,我一直困扰着这个问题。

问题:

您将获得N个整数数组。您必须找到一对(i,j) 从而最大化 GCD(a[i],a[j])+(j - i的值 和1 <= i

约束为:

2 <= N <= 10 ^ 5

1 <= a [i] <= 10 ^ 5

我已经使用python尝试过此问题

2 个答案:

答案 0 :(得分:0)

这里是做到这一点的一种方法。

创建一个可变类MinMax来存储最小值。和最大索引。

创建一个Map<Integer, MinMax>用于存储分钟。和最大特定除数的索引。

对于a中的每个值,找到a[i]的所有除数,并相应地更新映射,以便MinMax对象存储最小值。和最大具有该特定除数的数字的i

完成后,迭代地图并找到计算key + value.max - value.min的结果最大的条目。

分钟和最大该条目的值就是您的答案。

答案 1 :(得分:0)

这是一种可行的方法:

result = 0
min_i = array[1 ... 100000] initialized to 0
for j in [1, 2, ..., n]
    for d in divisors of a[j]
        let i = min_i[d]
        if i > 0
            result = max(result, d + j - i)
        else
            min_i[d] = j

在这里,每个min_i[d]的{​​{1}}是最小的d,因此i。我们在内部循环中使用它来为每个a[i] % d == 0查找数组中具有d的GCD至少为a[j]的第一个元素。如果dj最大的可能值之一,则当内部循环以等于所需GCD的gcd(a[i], a[j]) + j - i运行时,d将被设置为正确的值。答案。

小于或等于100,000的自然数的最大除数为128(请参见here)。因此,内部循环最多运行128 * 100,000 = 1280万次。我想这可以通过一些优化来实现(尽管可能不是在Python中)。

(要遍历除数,请使用筛子为1至100000中的每个整数预先计算最小的平凡除数。)