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

C++ দিয়ে দিয়ে হয়ে রেঞ্জে জোড়/বিজোড় সংখ্যার প্রোবাবিলিটি কোয়ারী

দেওয়া রেঞ্জগুলোতে সংখ্যাগুলোর প্যারিটি (parity) অর্থাৎ সেগুলো জোড় নাকি বিজোড় তা বের করে প্রোবাবিলিটি নির্ণয় করতে হবে। প্রতিটি কোয়ারীর জন্য p এবং q প্রিন্ট করতে হবে যাতে প্রোবাবিলিটি = p/q হয়। উদাহরণ −

ইনপুট: N = 5, arr[] = { 6, 5, 2, 1, 7 } কোয়ারী 1: 0 2 2, কোয়ারী 2: 1 2 5, কোয়ারী 3: 0 1 4 আউটপুট: 0, 3, 4, 1, 2

এই সমস্যাতেই, আমরা দুটি অ্যারে মেইনটেইন করব যেগুলো i-তম ইনডেক্স পর্যন্ত কতগুলো জোড় এবং বিজোড় সংখ্যা আছে তা রাখবে। এতে সমস্যা সহজ হয়ে যায় এবং আমাদের শুধু সেই রেঞ্জে উপাদান সংখ্যা ও জোড়/বিজোড়ের কাউন্ট প্রিন্ট করতে হবে।

সমাধানের পদ্ধতি

এই পদ্ধতিতে, আমরা দুটি অ্যারে মেইনটেইন করি যেগুলো i-তম ইনডেক্স পর্যন্ত পাওয়া যাওয়া জোড় ও বিজোড় সংখ্যার গণনা রাখে। এরপর এই সমস্যাকে প্রিফিক্স সম (prefix sum) সমস্যাのように সমাধান করি।

উদাহরণ
 #include <bits/stdc++.h> using namespace std; void solve(int arr[], int n, int Q, int query[][3]){     int even[n + 1]; // i-তম ইনডেক্স পর্যন্ত জোড় সংখ্যা     int odd[n + 1]; // i-তম ইনডেক্স পর্যন্ত বিজোড় সংখ্যা     even[0] = 0; odd[0] = 0; // ১-বেসড ইনডেক্সিং için ০-ই ইনডেক্স ০     for (int i = 0; i < n; i++) {         if (arr[i] & 1) { // বিজোড় পেলে odd বাড়ানো             odd[i + 1] = odd[i] + 1;             even[i + 1] = even[i];         }         else { // জোড় পেলে even বাড়ানো             even[i + 1] = even[i] + 1;             odd[i + 1] = odd[i];         }     }     for (int i = 0; i < Q; i++) { // কোয়ারী ট্রাভার্স         int r = query[i][2]; // ডান রেঞ্জ         int l = query[i][1]; // বাম রেঞ্জ         int k = query[i][0]; // কোয়ারী টাইপ         int q = r - l + 1; // রেঞ্জে মোট উপাদান         int p;         if (k) // k=1 হলে বিজোড়, k=0 হলে জোড়             p = odd[r] - odd[l - 1];         else             p = even[r] - even[l - 1];         if (!p) // p=0 হলে ০ প্রিন্ট             cout << "0\n";         else if (p == q) // p=q হলে ১ প্রিন্ট             cout << "1\n";         else {             int g = __gcd(p, q);             cout << p / g << " " << q / g << "\n"; // GCD দিয়ে সরল করা         }     } } int main(){     int arr[] = { 6, 5, 2, 1, 7 };     int n = sizeof(arr) / sizeof(int);     int Q = 2;     int query[Q][3] = {{ 0, 2, 2 },{ 1, 2, 5 }};     solve(arr, n, Q, query);     return 0; }
আউটপুট
0 3 4
কোডের ব্যাখ্যা

উপরের পদ্ধতিতে, আমরা i-তম ইনডেক্স পর্যন্ত পাওয়া যাওয়া জোড় ও বিজোড় সংখ্যা দুটি অ্যারেতে রাখি। এখন দেওয়া রেঞ্জে কতগুলো জোড় বা বিজোড় সংখ্যা আছে তা বের করে সেই সংখ্যা এবং রেঞ্জে মোট উপাদান সংখ্যা প্রিন্ট করি।

উপসংহার

এই টিউটোরিয়ালে আমরা দিয়ে হয়ে রেঞ্জে জোড় বা বিজোড় সংখ্যার প্রোবাবিলিটি নির্ণয় করার কোয়ারী সমাধান করেছি। আমরা এই সমস্যার C++ প্রোগ্রাম ও সম্পূর্ণ পদ্ধতি দেখেছি। একই প্রোগ্রাম C, Java, Python ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।

  1. C++-এ একটি মোবাইল নম্বর ফ্যান্সি (Fancy) কিনা চেক করা

  2. C++-এ একটি সংখ্যা প্রদত্ত বেসে আছে কিনা তা যাচাই করা

  3. C++ প্রোগ্রাম: কন্ডিশনাল স্টেটমেন্ট ছাড়া "Even" বা "Odd" প্রিন্ট

  4. C++ প্রোগ্রাম: সংখ্যা Even (জোড়) নাকি Odd (বিজোড়) যাচাই