Math 查询预处理

Math 查询预处理,math,dynamic-programming,mathematical-optimization,Math,Dynamic Programming,Mathematical Optimization,我有一个x整数数组,我需要回答y查询。每个查询有3个整数(数字、左索引、右索引)。我需要计算GCD(数字,数组[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个查询,该怎么办 我正在考虑做一些预处理,但没有任何想法。可以为数组元素的因式分解中的每个素数存储索

我有一个x整数数组,我需要回答y查询。每个查询有3个整数(数字、左索引、右索引)。我需要计算GCD(数字,数组[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

索引可以实现为成对的列表(数组中的位置,素数幂),搜索段是在日志中

例如,如果数组是[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。

奇怪的是,您拥有与查询相同数量的元素。查询是元素本身吗?至于处理方面的帮助,这取决于您想要什么样的性能。我将从分解所有元素开始。GCD可以看作是因子分解的多集交集。数组排序了吗?元素是否在“合理”范围内(上限)?@Ante no数组不是sorted@Nuclearman是的,我得到了分解部分,但我如何才能更有效地回答查询?这当然是当前Codechef竞赛中的问题。如果你环顾四周,你会发现有另一个问题是关于同一个问题的,这个问题有一些提示。一般的提示是,段树可能会有所帮助,但为此目的构建一个段树可能会很麻烦。