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

C++-এ K ইনভার্সন সহ পারমুটেশন সংখ্যা বের করুন


একটি অ্যারেতে একটি পেয়ার a[i], a[j] ইনভার্সন বলা হয় যদি a[i] > a[j] এবং i < j। আমাদের কাছে দুটি সংখ্যা N এবং k আছে, এবং আমাদের বের করতে হবে প্রথম N সংখ্যার কতগুলো সম্ভাব্য পারমুটেশন আছে যারা ঠিক K ইনভার্সন দিয়ে শেষ হয়। উদাহরণ:

ইনপুট: N = 4, K = 1
আউটপুট: 3
ব্যাখ্যা: প্রথম N সংখ্যার সব পারমুটেশন: 1234, 1243, 1324 এবং 2134।
1 ইনভার্সনসহ পারমুটেশন: 1243, 1324 এবং 2134।
ইনপুট : N = 3, K = 2
আউটপুট : 3
ব্যাখ্যা: প্রথম N সংখ্যার সব পারমুটেশন: 123, 132, 213, 231, 312, এবং 321
2 ইনভার্সনসহ: 231, 312 এবং 321।

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

আমরা ব্রুট ফোর্স পদ্ধতি próp করতে পারি, যা হলো প্রথম N সংখ্যার সকল পারমুটেশন বের করে তারপর সকল ইনভার্সন চেক করা যে সেটি K-এর সমান কিনা। হ্যাঁ হলে রেজাল্ট কাউন্টার বাড়ানো।

দক্ষ পদ্ধতি (Efficient Approach)

এই পদ্ধতিতে, আমাদের কাছে প্রথম N প্রাকৃতিক সংখ্যার N ডিজিট আছে। সকল পারমুটেশন কোথাও অন্যत्र হিসাব করা হয়েছে যেখান থেকে আমরা K পারমুটেশন খুঁজছি। সেটি বের করতে, আমরা পরবর্তী Nth (সর্বোচ্চ) সংখ্যাটি সকল পারমুটেশনে ইনসার্ট করব এবং যেসব সংখ্যার ইনভার্সন কাউন্ট এই সংখ্যা যোগ করার পর K-এর সমান হয় সেগুলো আমাদের রেজাল্টে কাউন্ট হবে। (N-1) সংখ্যার ওই পারমুটেশন নিব যাদের (K-3) ইনভার্সন নেই, নতুন সংখ্যাটি শেষ থেকে ৩য় ইনডেক্সে শিফট করব। ইনভার্সন সংখ্যা হবে K, এবং find_permutations(N-1, K-3) হবে আমাদের উত্তর। একই লজিক অন্যান্য ইনভার্সনের জন্যও ব্যবহার করা যায়, এবং আমরা উপরের রিকার্সন ফর্মুলায় পৌঁছাব।

ইনপুট

#include <bits/stdc++.h> using namespace std; const int X = 100; int a = 0; int arr[X][X]; // রিকার্সিভ ফাংশন int find_permutations (int N_numbers, int K_inversion){     if (N_numbers == 0){       return 0;             // N ০ হলে ০ রিটার্ন     }     if (K_inversion == 0)         return 1;             // K ১ হলে ১ রিটার্ন     if (arr[N_numbers][K_inversion] != 0)         return arr[N_numbers][K_inversion];     int result = 0;     for (int i = 0; i <= K_inversion; i++){         if (i <= N_numbers - 1)           result += find_permutations (N_numbers - 1, K_inversion - i);     }     arr[N_numbers][K_inversion] = result;     return result; } // main function int main (){     int N, K;     cin >> N;     // ইউজার থেকে ইনপুট     cin >> K;     cout << find_permutations (N, K);     return 0; }

আউটপুট

0

ইনপুট − N = 4, K = 3

আউটপুট − 6

উপসংহার

এই আর্টিকেলে আমরা O(N * K) সময় জটিলতায় K ইনভার্সন সহ পারমুটেশন সংখ্যা বের করার সমস্যা সমাধান করেছি। আমরা এই সমস্যার জন্য C++ প্রোগ্রাম এবং সমাধানের পূর্ণ পদ্ধতি (সাধারণ এবং দক্ষ) শিখেছি। একই প্রোগ্রাম C, Java, Python বা অন্য ভাষায় লেখা যায়। আশা করি এই আর্টিকেলটি সহায়ক হবে।


  1. C++ ব্যবহার করে পেন্টাগোনাল পিরামিডাল সংখ্যা নির্ণয় করুন

  2. C++ দিয়ে একটি স্ট্রিংয়ের সাবস্ট্রিং-এর সংখ্যা বের করা

  3. C++-এ ট্রেন স্টপেজ স্টেশন সংখ্যা বের করুন

  4. C++-এ সেটে রিফ্লেক্সিভ রিলেশন সংখ্যা বের করুন