C++程序 用于范围LCM查询
给定一个整数数组,计算LCM(l, r)形式的查询。可能有许多查询,因此需要有效地评估这些查询。
LCM(l,r)表示位于索引l和r之间的数组元素的LCM(包括两个索引)
数学上,
LCM(l,r)= LCM(arr[l],arr[l + 1],……,
arr [r-1],arr [r])
例子:
输入:数组= {5,7,5,2,10,12,11,17,14,1,44}
查询:LCM(2,5),LCM(5,10),LCM(0,10)
输出:60 15708 78540
说明:在第一个查询中,LCM(5,2,10,12)= 60,同样适用于其他查询。
一个简单的方法是遍历每个查询并使用以下公式计算答案,
LCM(a, b) = (a*b) / GCD(a,b)
然而,由于查询数可能很大,这种方法是不切实际的。
一种有效的解决方案是使用线段树。回想一下,在这种情况下,不需要更新,我们可以构建树一次,然后可以重复使用该树来回答查询。树中的每个节点应存储该特定段的LCM值,我们可以使用上述公式组合段。因此,我们可以有效地回答每个查询!
下面是相应的解决方案。
输出结果: