在Python中找给定数字列表的所有查询的kpr sum的程序

在Python中找给定数字列表的所有查询的kpr sum的程序

假设我们有一个数字列表nums。我们还有一个查询列表,其中queries [i]包含三个元素[k,p,r],对于每个查询,我们都必须找到kpr_sum。kpr_sum的公式如下。

\mathrm{{𝑘𝑝𝑟}\_{𝑠𝑢𝑚} =\sum_{\substack{𝑖=𝑃}}^{𝑅−1}\sum_{\substack{𝑗=𝑖+1}}^{𝑅}(𝐾 ⊕(𝐴[𝑖]⊕𝐴[𝑗]))}

如果和太大,那么返回和模10 ^ 9 + 7。

因此,如果输入如下nums = [1,2,3] queries = [[1,1,3],[2,1,3]],则输出将是[5,4],因为第一个元素是(1 XOR(1 XOR 2))+(1 XOR(1 XOR 3))+(1 XOR(2 XOR 3)) = 5,类似地,对于第二个查询,它是4。

要解决此问题,我们将遵循以下步骤−

  • m:= 10^9 + 7
  • N:= nums的大小
  • q_cnt:=查询的大小
  • C:=新列表
  • res:=新列表
  • 对于i在0到19的范围内,执行以下操作 –
    • R:=具有单个元素0的数组
    • t:=0
    • 对于nums中的每个x,执行以下操作 –
      • t:= t + (在右移i次后的x) AND 1
      • 将t插入R的末尾
    • 将R插入C的末尾
  • 对于j在0到q_cnt的范围内,执行以下操作 –
    • (K,P,R):=查询[j]
    • d:= R-P + 1
    • t:= 0
    • 对于i在0到19的范围内,执行以下操作 –
      • n1:= C [i,R] -C [i,P-1]
      • n0:= d – n1
      • 如果(K在右移i次后)AND 1为非零,则 –
      • x:= (n1 *(n1-1)+ n0 *(n0-1))/ 2的商
      • 否则,
      • x:= n1 * n0
      • t:=(t +(在左移i次后的x))mod m
    • 将t插入res的末尾
  • 返回res

例子

让我们看一下以下实现,以更好地了解−

def solve(nums, queries):
    m = 10 ** 9 + 7
    N = len(nums)
    q_cnt = len(queries)
    C = []
    res = []
    for i inrange(20):
        R = [0]
        t = 0
        for x in nums:
            t += (x >> i) & 1
            R.append(t)
        C.append(R)
    for j in range(q_cnt):
        K, P, R = queries[j]
        d = R - P + 1
        t = 0
        for i in range(20):
            n1 = C[i][R] - C[i][P-1]
            n0 = d - n1
            if (K >> i) & 1:
                x = (n1 * (n1 - 1) + n0 * (n0 - 1)) >> 1
            else:
                x = n1 * n0
            t = (t + (x << i)) % m
        res.append(t)
    
    return res

nums = [1,2,3]
queries = [[1,1,3],[2,1,3]]
print(solve(nums, queries))

输入

[1,2,3],[[1,1,3],[2,1,3]]

输出

[5,4]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程