Ranges之间的GCD

时间:2015-03-19 15:59:41

标签: algorithm

我给出了一个大小为N的数组。我有Q查询我必须计算L和R之间的gcd LR,其中1≤L≤R≤N。

如何有效地计算它因为蛮力方法会失败。

2 个答案:

答案 0 :(得分:1)

GCD是加性和可交换的。这意味着段树可以使用每个范围GCD查询的log(N)时间来解决此问题。

Wikipedia has a nice article about segment trees

答案 1 :(得分:1)

段树可用于在适度的时间内进行预处理和查询。对于分段树,预处理时间为O(n),GCD查询的时间为 O(Logn) 。所需的额外空间是O(n)来存储段树。

细分树的表示

  • 叶子节点是输入数组的元素。
  • 每个内部节点代表其下所有叶子的GCD。

树的数组表示用于表示段树,即,对于索引i处的每个节点,

  • 左孩子在索引2 * i + 1
  • 2 * i + 2的正确孩子,父母在地板上((i-1)/ 2)。

可以在http://www.geeksforgeeks.org/gcds-of-a-given-index-ranges-in-an-array/

找到实施