কম্পিউটার টিউটোরিয়াল

পাইথনে দেয়া নাম্বার লিস্টের সব কোয়ারীর জন্য KPR সম গণনা করার প্রোগ্রাম


আমাদের একটি নাম্বার লিস্ট আছে nums। আমাদের আরেকটি কোয়ারী লিস্ট আছে queries যেখানে queries[i] তিনটি এলিমেন্ট [k, p, r] ধারণ করে, প্রতিটি কোয়ারীর জন্য আমাদের kpr_sum বের করতে হবে। kpr_sum-এর সূত্র নিচের মতো:

$$\mathrm{kpr\_sum = \sum_{i=P}^{R-1}\sum_{j=i+1}^{R}(K \oplus (A[i] \oplus A[j])))}$$

যদি যোগফল অনেক বড় হয়, তবে 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, এবং দ্বিতীয় কোয়ারীর জন্য ৪।

সমাধানের ধাপসমূহ (বিট ম্যানিপুলেশন + প্রিফিক্স সম)

  • m := 10^9 + 7

  • N := nums-এর আকার, q_cnt := queries-এর আকার

  • C := একটি নতুন লিস্ট

  • res := একটি নতুন লিস্ট

  • i = 0 থেকে ১৯ পর্যন্ত লুপ চালান (বিট পজিশন):

    • R := [0] দিয়ে একটি অ্যারে শুরু করুন

    • t := 0

    • nums-এর প্রতিটি x এর জন্য:

      • t += (x >> i) & 1

      • R.append(t)

    • R-কে C-এ যোগ করুন

  • j = 0 থেকে q_cnt-1 পর্যন্ত লুপ চালান:

    • (K, P, R) := queries[j]

    • d := R - P + 1

    • t := 0

    • i = 0 থেকে ১৯ পর্যন্ত লুপ চালান:

      • n1 := C[i][R] - C[i][P-1]

      • n0 := d - n1

      • যদি (K >> i) & 1 নন-জিরো হয়, তবে:

        • x := (n1*(n1-1) + n0*(n0-1)) >> 1

      • অন্যথায়:

        • x := n1 * n0

      • t := (t + (x << i)) % m

    • t-কে res-এ যোগ করুন

  • 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]
  1. লিস্টের কিউমুলেটিভ সাম বের করার পাইথন প্রোগ্রাম

  2. পাইথনে লিস্টের এলিমেন্টগুলোর যোগফল বের করা

  3. পাইথনে লিস্টের সব পেয়ারের অ্যাবসোলিউট ডিফারেন্সের যোগফল

  4. Python-এ সংখ্যাগুলোর লিস্টের যোগফল (Sum) বের করা