ধরুন আমাদের দুটি সংখ্যা N এবং K আছে। কাজটি হল K সংখ্যাগুলি প্রিন্ট করা, যেগুলি 2 এর শক্তি এবং তাদের যোগফল হল N। যদি এটি সম্ভব না হয়, তাহলে -1 ফেরত দিন . ধরুন N =9 এবং K =4, তাহলে আউটপুট হবে 4 2 2 1, যার যোগফল 9, এবং অনেকগুলি উপাদানের সংখ্যা 4, এবং তাদের প্রতিটির শক্তি 2।
এই সমস্যা সমাধানের জন্য আমাদের এই পদক্ষেপগুলি অনুসরণ করতে হবে -
-
যদি k সেট বিটের সংখ্যা N এর চেয়ে কম বা N সংখ্যার চেয়ে বেশি হয়, তাহলে -1 ফেরত দিন
-
অগ্রাধিকার সারিতে সেট বিটে দুটির ক্ষমতা যোগ করুন
-
আমরা K উপাদান না পাওয়া পর্যন্ত অগ্রাধিকার সারি শুরু করুন, তারপর অগ্রাধিকার সারি থেকে উপাদানটি সরান
-
অপসারণ করা উপাদান/2 আবার অগ্রাধিকার সারিতে দুবার প্রবেশ করান
-
যদি k উপাদানগুলি অর্জন করা হয়, তাহলে সেগুলি প্রিন্ট করুন৷
উদাহরণ
#include<iostream> #include<algorithm> #include<queue> using namespace std; void displayKnumbers(int n, int k) { int set_bit_count = __builtin_popcount(n); if (k < set_bit_count || k > n) { cout << "-1"; return; } priority_queue<int> queue; int two = 1; while (n) { if (n & 1) { queue.push(two); } two = two * 2; n = n >> 1; } while (queue.size() < k) { int element = queue.top(); queue.pop(); queue.push(element / 2); queue.push(element / 2); } int ind = 0; while (ind < k) { cout << queue.top() << " "; queue.pop(); ind++; } } int main() { int n = 30, k = 5; cout << "Numbers are: "; displayKnumbers(n, k); }
আউটপুট
Numbers are: 8 8 8 4 2