C++程序 数组中范围乘积
给定大小为N的数组A[]。解决Q个查询。在模P(P为质数)下找到范围[L,R]中的乘积。
示例:
输入:A[] = {1,2,3,4,5,6}
L = 2,R = 5,P = 229
输出:120
输入:A[] = {1,2,3,4,5,6},
L = 2,R = 5,P = 113
输出:7
暴力法
对于每个查询,遍历[L,R]范围内的每个元素,并在模P下计算乘积。这将在O(N)中回答每个查询。
输出 :
高效使用 模意义下的乘法逆元:
由于P是质数,我们可以使用模乘法逆元。使用动态编程,我们可以在模P下计算预乘数组,使得索引i处的值包含范围[0,i]中的乘积。同样,我们可以计算模P下的预反转乘积。现在,每个查询都可以在O(1)中回答。
反转乘积数组在索引i处包含范围[0,i]中的倒数乘积。因此,对于查询[L,R],答案将是Product[R] * InverseProduct [L-1]
注意:我们无法像Product[R]/Product[L-1]那样计算答案,因为在模P下计算乘积。如果我们不在模P下计算产品,就始终存在溢出的可能性。
输出: