কম্পিউটার

পাইথনে প্রদত্ত সংখ্যার তালিকার জন্য সমস্ত প্রশ্নের জন্য kpr যোগফল খুঁজে বের করার প্রোগ্রাম


ধরুন আমাদের সংখ্যা সংখ্যার একটি তালিকা আছে। আমাদের কাছে প্রশ্নগুলির একটি তালিকাও রয়েছে যেখানে ক্যোয়ারী[i]-এ তিনটি উপাদান রয়েছে [k, p, r], প্রতিটি প্রশ্নের জন্য আমাদের kpr_sum খুঁজে বের করতে হবে। kpr_sum-এর সূত্র নিচের মত।

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

যদি যোগফল খুব বড় হয়, তাহলে যোগফল মডিউল 10^9+7 ফেরত দিন।

সুতরাং, যদি ইনপুটটি সংখ্যার মত হয় =[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।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • m :=10^9 + 7
  • N :=সংখ্যার আকার
  • q_cnt :=প্রশ্নের আকার
  • C :=একটি নতুন তালিকা
  • res :=একটি নতুন তালিকা
  • আমি 0 থেকে 19 রেঞ্জের জন্য, কর
    • R :=একক উপাদান 0 সহ একটি অ্যারে
    • t :=0
    • সংখ্যায় প্রতিটি x এর জন্য, করুন
      • t :=t + (x i বার ডানদিকে সরানোর পর) এবং 1
      • R এর শেষে t ঢোকান
    • C এর শেষে R ঢোকান
  • 0 থেকে q_cnt রেঞ্জের মধ্যে j-এর জন্য
      করুন
    • (K, P, R) :=প্রশ্ন[j]
    • d :=R - P + 1
    • t :=0
    • আমি 0 থেকে 19 রেঞ্জের জন্য, কর
      • n1 :=C[i, R] - C[i, P-1]
      • n0 :=d - n1
      • যদি (i বার ডানে স্থানান্তর করার পরে K) এবং 1 অ-শূন্য হয়, তাহলে
        • x :=(n1 *(n1 - 1) + n0 *(n0 - 1))/2 এর ভাগফল
      • অন্যথায়,
        • x :=n1 * n0
      • t :=(t +(x বাম দিকে বার করার পর)) মোড m
    • res এর শেষে t ঢোকান
  • রিটার্ন রিটার্ন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

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]

  1. পাইথন প্রোগ্রাম একটি তালিকার ক্রমবর্ধমান যোগফল খুঁজে বের করতে

  2. পাইথন প্রোগ্রাম তালিকায় উপাদানের যোগফল খুঁজে বের করতে

  3. পাইথন প্রোগ্রাম একটি তালিকার সমস্ত জোড়ার মধ্যে পরম পার্থক্যের যোগফল খুঁজে বের করতে

  4. পাইথনে সংখ্যার তালিকার যোগফল কীভাবে খুঁজে পাবেন?