বিবৃতি: একটি সংখ্যার ঘাতের रूपে দেওয়া ওজন দিয়ে প্যান ব্যালেন্স করা।
বিবরণ: এই সমস্যায় একটি প্যান-ভিত্তিক ওজন মাপা মেশিন দেওয়া আছে। একটি ওজন T এবং কিছু অন্যান্য ওজন দেওয়া আছে যাদের মান একটি সংখ্যা a-র ঘাত। দত্ত ওজনগুলো দিয়ে প্যান দুটো ব্যালেন্স করতে হবে।
এইভাবেই আমরা একটি সমীকরণ পাই:
T + (a-এর কিছু ঘাত) = (a-এর অন্য কিছু ঘাত)
মনে রাখতে হবে প্রতিটি ঘাতের মানের জন্য ঠিক একটি ওজন রয়েছে।
উদাহরণ:
T = 12 : a = 4
নিচের মানগুলো দিয়ে ওজন ব্যালেন্স করা যায়:
12 + 4 = 16
এই সমস্যা সমাধানের জন্য T কে a-এর ঘাত হিসেবে প্রকাশ করতে হবে। এর জন্য T-এর বেস ১০ থেকে a-তে পরিবর্তন করা হবে।
CASE ১: বেস পরিবর্তন করলে যদি রিপ্রেজেন্টেশনে শুধু ১ এবং ০ থাকে। তখন ১-গুলোর ওজনগুলো যোগ করেই T-এর মান তৈরি করা যায়।
উদাহরণ:
T = 10 : a = 3,
১০ কে বেস ৩-এ রূপান্তর করলে ১০১ হয়। তাই ৩0 এবং ৩2 (১ + ৯) = ১০ দিয়ে ব্যালেন্স করা যাবে।
CASE ২: বেস পরিবর্তন করলে যদি ১ এবং ০ ছাড়া অন্য মান থাকে। এখানে বাধ্যতামূলক শর্ত হলো বেস রিপ্রেজেন্টেশনে (a - 1) মান থাকতে হবে। এই কেসে, সেই ঘাতের ওজনটি T-এর পাশে সরিয়ে দিতে হবে এবং বেস রিপ্রেজেন্টেশনের সংখ্যাকে ১ বাড়াতে হবে।
উদাহরণ:
T = 7 : a = 3
৭ কে বেস ৩-এ রূপান্তর করলে ০২১ পাওয়া যায়। ৩1 T-এর পাশে সরিয়ে এবং অন্য পাশে ১ বাড়িয়ে সংখ্যা হয় ১০ যেটি ১০১ হিসেবে প্রকাশিত (৯ + ১)। যা ব্যালেন্স করা সম্ভব।
উপরের কেসগুলো ভিত্তি করে সমস্যা সমাধানের প্রোগ্রাম বানানো যাক।
উদাহরণ
#include <bits/stdc++.h> using namespace std; bool isBalancePossible(int T, int a){ vector<int> baseForm; while (T) { baseForm.push_back(T % a); T /= a; } baseForm.push_back(0); for (int i = 0; i < baseForm.size(); i++) { if (baseForm[i] != 0 && baseForm[i] != 1 && baseForm[i] != (a - 1) && baseForm[i] != a) return false; if (baseForm[i] == a || baseForm[i] == (a - 1)) baseForm[i + 1] += 1; } return true; } int main(){ int T = 21; int a = 4; if (isBalancePossible(T, a)) cout << "Balance is possible" << endl; else cout << "Balance is not possible" << endl; return 0; } আউটপুট
Balance is possible