Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 范围之间的GCD_Algorithm - Fatal编程技术网

Algorithm 范围之间的GCD

Algorithm 范围之间的GCD,algorithm,Algorithm,我已经给出了一个大小为N的数组。我有Q个查询,我必须计算L和R之间的gcd,其中L R,其中1≤ L≤ R≤ N.如何有效地计算它,因为暴力方法将失败 GCD是可加的和可交换的。这意味着段树可以通过每个范围的日志(N)时间GCD查询来解决这个问题 段树可以在适当的时间内进行预处理和查询。对于段树,预处理时间为O(n),GCD查询的时间为O(Logn)。存储段树所需的额外空间为O(n) 段树的表示法 叶节点是输入数组的元素 每个内部节点表示其下所有叶子的GCD 树的数组表示用于表示段树,即索引

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

如何有效地计算它,因为暴力方法将失败

GCD是可加的和可交换的。这意味着段树可以通过每个范围的日志(N)时间GCD查询来解决这个问题


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

段树的表示法

  • 叶节点是输入数组的元素
  • 每个内部节点表示其下所有叶子的GCD
树的数组表示用于表示段树,即索引i处的每个节点

  • 左子项位于索引2*i+1处
  • 右孩子在2*i+2,父母在楼层((i-1)/2)

可以在这里找到实现

如何处理数组值?实际上GCD相当快。你能提供一些违禁品吗?也就是说,N和Q的期望值是什么?如果我理解正确,数组的目的是帮助您高效地计算GCD。阵列中的数据类型是什么?你能选择它吗?gcd是关联的,所以你可以做通常基于树的事情(一个节点存储它所覆盖范围内所有项目的gcd,只需取其直接子节点的gcd即可构造)。然后查询只需要O(logn)gcd。猜测一下,这是来自于你所说的“加法”?@fjardon gcd(a,b,c)=gcd(gcd(a,b),c)