Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาผลรวม kpr สำหรับการสืบค้นทั้งหมดสำหรับรายการตัวเลขที่ระบุใน Python


สมมติว่าเรามีรายการตัวเลข นอกจากนี้เรายังมีรายการข้อความค้นหาที่การสืบค้นข้อมูล[i] ประกอบด้วยสามองค์ประกอบ [k, p, r] สำหรับแต่ละข้อความค้นหา เราจะต้องหา kpr_sum สูตรสำหรับ kpr_sum มีดังนี้

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

หากผลรวมมากเกินไป ให้ส่งคืนผลรวมโมดูโล 10^9+7

ดังนั้นหากอินพุตเป็นเหมือน nums =[1,2,3] แบบสอบถาม =[[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

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ม :=10^9 + 7
  • N :=ขนาดของ nums
  • q_cnt :=ขนาดของข้อความค้นหา
  • C :=รายการใหม่
  • res :=รายการใหม่
  • สำหรับฉันในช่วง 0 ถึง 19 ให้ทำ
    • R :=อาร์เรย์ที่มีองค์ประกอบเดี่ยว 0
    • t :=0
    • สำหรับแต่ละ x เป็น nums ทำ
      • t :=t + (x หลังจากขยับ i ครั้งไปทางขวา) และ 1
      • ใส่ t ต่อท้าย R
    • แทรก R ที่ส่วนท้ายของ C
  • สำหรับ j ในช่วง 0 ถึง q_cnt ทำ
    • (K, P, R) :=แบบสอบถาม[j]
    • d :=R - P + 1
    • t :=0
    • สำหรับฉันในช่วง 0 ถึง 19 ให้ทำ
      • n1 :=C[i, R] - C[i, P-1]
      • n0 :=d - n1
      • ถ้า (K หลังจากเลื่อน i ครั้งไปทางขวา) และ 1 ไม่ใช่ศูนย์ แล้ว
        • x :=ผลหารของ (n1 *(n1 - 1) + n0 *(n0 - 1))/2
      • มิฉะนั้น
        • x :=n1 * n0
      • t :=(t +(x หลังจากขยับ i ครั้งไปทางซ้าย)) mod m
    • ใส่ t ต่อท้าย res
  • ผลตอบแทน

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def solve(nums, queries):
    m = 10**9 + 7
    N = len(nums)
    q_cnt = len(queries)
    C = []
    res = []
    for i in range(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]