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

একটি সংখ্যা খুঁজুন যা একটি স peł수의 배열ের প্রতিটি সংখ্যার সাথে XOR করলে ন্যূনতম যোগফল দেয় (C++)

কoncepশন

অ-নেতিবাচক পূর্ণসংখ্যার একটি অ্যারে Arr[] দেওয়া থাকলে, একটি পূর্ণসংখ্যা X নির্ধারণ করা হয় যাতে (Arr[0] XOR X) + (Arr[1] XOR X) + … + (Arr[n-1] XOR X) এর যোগফল ন্যূনতম হয়।

পদ্ধতি

প্রতিটি সংখ্যার বাইনেরি উপস্থাপনায় 'i'-তম বিট যাচাই করে এবং সেট বিটগুলির গণনা করা হয়। যেহেতু সেট বিটগুলি যোগফলকে সর্বাধিক করার পরিবর্তে ন্যূনতম করতে সাহায্য করে, তাই যদি গণনা N/2-এর চেয়ে বেশি হয়, তবে আমাদের কনস্ট্রাক্ট করা সংখ্যার 'i'-তম বিটকে '0' সেট করতে হবে। আর যদি গণনা N/2-এর চেয়ে কম হয়, তবে সেট বিটযুক্ত সংখ্যাগুলো কম থাকায় এটি উত্তরকে প্রভাবিত করবে না। XOR অপারেশানানুযায়ী, যখন দুটি বিট সমান (A XOR B, যেখানে A=B), ফলাফল '0' হয়। তাই আমরা কনস্ট্রাক্ট করা সংখ্যার 'i'-তম বিটকে '1' সেট করি, যাতে (1 XOR 1) = '0' হয় এবং যোগফল ন্যূনতম হয়।

উদাহরণ

// C++ প্রোগ্রাম
#include <bits/stdc++.h>
using namespace std;

void findX(int arr[], int n) {
    int* itr = max_element(arr, arr + n);
    int p = log2(*itr) + 1;
    int X = 0;
    
    for (int i = 0; i < p; i++) {
        int count = 0;
        for (int j = 0; j < n; j++) {
            if (arr[j] & (1 << i))
                count++;
        }
        if (count > (n / 2))
            X += (1 << i);
    }
    
    long long sum = 0;
    for (int i = 0; i < n; i++)
        sum += (X ^ arr[i]);
    
    cout << "X = " << X << ", Sum = " << sum;
}

int main() {
    int arr[] = {3, 4, 5, 6, 7};
    int n = sizeof(arr) / sizeof(arr[0]);
    findX(arr, n);
    return 0;
}

আউটপুট

X = 7, Sum = 10
  1. C++ ব্যবহার করে অ্যারেতে XOR ০ হয় এমন জোড়ার সংখ্যা বের করা

  2. C++ ব্যবহার করে একটি সংখ্যার ফ্যাক্টরের ন্যূনতম যোগফল বের করা

  3. C++-এ অ্যারেতে ন্যূনতম সংখ্যা যোগ করে যোগফল জোড় করার পদ্ধতি

  4. পাইথনে অ্যারেয়ের সব সংখ্যার সাথে XOR করলে ন্যূনতম যোগফল দেয় এমন সংখ্যা খুঁজুন