查询预处理

时间:2014-03-10 13:01:50

标签: math dynamic-programming mathematical-optimization

我有x个整数数组,我需要回答y个查询。每个查询都有3个整数(Number,Left index,Right Index)。我需要计算GCD(Number,array [i])。我在查询中指定的左右范围内。现在我需要输出我在GCD计算中可以获得的最大数量。

实施例 - >假设数字是4 5 8 Query-> (6,1,3)---(数,左指数,右指数)GCD(6,4)= 2 GCD(6,5)= 1 GCD(6,8)= 2

所以回答是2.如果我在数组中有10 ^ 5个元素并且我需要回答10 ^ 5个查询怎么办?

我正在考虑做一些预处理,但没有任何想法。

1 个答案:

答案 0 :(得分:0)

可以为数组元素的因子分解中的每个素数存储索引,并且对于查询号,查看它在给定范围内的因子分解的索引,并找到它们之间的最大GCD。

指数可以实现为具有对的列表(数组中的位置,素数),搜索段是在日志中。

E.g。如果数组是[4,5,8,12,3],那么我们有3个不同的素数(2,3,5)和指数:

2 -> [(0, 4), (2, 8), (3, 4)]
3 -> [(3, 3), (4, 3)]
5 -> [(1,5)]

对于查询(6,1,3),因为6 = 2 * 3必须查看子索引:

2 -> [(2, 8), (3, 4)]
3 -> [(3, 3)]

走向并行'通过这些子指数,并使GCD的产品成为素数(查询数和指数第二元素中的最小权力)将产生所有可能的GCD。