【发布时间】:2014-03-10 13:01:49
【问题描述】:
我有 x 个整数数组,我需要回答 y 个查询。每个查询都有 3 个整数(数字、左索引、右索引)。我需要计算 GCD(Number, array[i])。 i 在查询中指定的左右范围内。现在我需要输出我在 GCD 计算中可以得到的最大数。
例子--> 假设数字是 4 5 8 查询-> (6,1,3)---(数字,左索引,右索引) GCD(6,4) = 2 GCD(6,5) = 1 GCD(6,8) = 2
所以答案是 2。如果数组中有 10^5 个元素并且我需要回答 10^5 个查询怎么办?
我正在考虑做一些预处理,但没有得到任何想法。
【问题讨论】:
-
您拥有与查询相同数量的元素似乎很奇怪。查询是元素本身吗?至于处理上的帮助,就看你想要什么样的性能了。我会从分解你的所有元素开始。 GCD 可以看作是分解的多集交集。
-
数组排序了吗?元素是否在“合理”范围内(上限)?
-
@Ante no 数组未排序
-
@Nuclearman 是的,我得到了分解部分,但我怎样才能更有效地回答查询?
-
这当然是当前 Codechef 比赛的问题 ANUGCD。如果您环顾四周,就会有另一个问题询问相同的问题,并且对此有一些提示。一般提示是分段树可能会有所帮助,但为此目的构建分段树可能会很麻烦。
标签: math dynamic-programming mathematical-optimization