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

C++ দিয়ে বাইনারি স্ট্রিং-এ ১ দিয়ে শুরু হওয়া অনন্য পারমুটেশনের সংখ্যা বের করা

দেওয়া সমস্যায়, আমাদের একটি স্ট্রিং দেওয়া আছে যা শুধু ০ এবং ১ দিয়ে গঠিত। আমাদের সেই স্ট্রিংয়ের এমন পারমুটেশনের (বিন্যাসের) মোট সংখ্যা বের করতে হবে যাতে স্ট্রিংটি ১ দিয়ে শুরু হয়। উত্তর খুব বড় হতে পারার কারণে, আমরা এটিকে ১০০০০০০০০৭ (১০⁹+৭) দিয়ে মডুলো করে প্রিন্ট করব।

ইনপুট: str = "10101001001" আউটপুট: 210
ইনপুট: str = "101110011" আউটপুট: 56

আমরা এই সমস্যাটি কৌম্বিনেটরিক্স (Combinatorics) এবং কিছু সূত্র প্রয়োগ করে সমাধান করব।

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

এই পদ্ধতিতে, আমরা স্ট্রিংয়েতে ০ এবং ১-এর সংখ্যা গণনা করব। ধরি, n = ১-এর সংখ্যা, m = ০-এর সংখ্যা, এবং L = স্ট্রিংয়ের দৈর্ঘ্য। তাহলে সমাধানের সূত্র হবে: (L-1)! / ((n-1)! * m!)।

উদাহরণ
#include <bits/stdc++.h> #define MOD 1000000007 using namespace std; long long fact(long long n) {     if(n <= 1) return 1;     return ((n % MOD) * (fact(n-1) % MOD)) % MOD; } int main() {     string s = "101110011";     long long L = s.size();     long long count_1 = 0, count_0 = 0;     for(auto x : s) {       if(x == '1') count_1++;       else count_0++;     }     if(count_1 == 0){       cout << "0\n";     } else {       long long factL = fact(L-1);       long long factn = fact(count_1 - 1);       long long factm = fact(count_0);       long long ans = factL / (factn * factm);       cout << ans << "\n";     }     return 0; }
আউটপুট
56

উপরোক্ত প্রোগ্রামটির টাইম কমপ্লেক্সিটি O(N), যেখানে N হলো দেওয়া স্ট্রিংয়ের দৈর্ঘ্য।

কোডের ব্যাখ্যা

এই পদ্ধতিতে, আমরা স্ট্রিংয়েতে ১ এবং ০-এর ফ্রিকোয়েন্সি গণনা করি। তারপর প্রথমে একটি ১ ঠিকিয়ে দিয়ে, বাকি L-1 দৈর্ঘ্যের স্ট্রিংয়ে বাকি ১ এবং ০-গুলোকে কতভাবে বিন্যাস করা যায় তা বের করি। এখান থেকে উপরের সূত্রটি প্রাপ্ত হয়: (L-1)! / ((n-1)! * m!)। এখানে (n-1)! হলো বাকি ১-দের পারমুটেশন এবং m! হলো ০-দের পারমুটেশন।

উপসংহার

এই আর্টিকেলে আমরা একটি বাইনারি স্ট্রিংয়ের ১ দিয়ে শুরু হওয়া অনন্য পারমুটেশনের সংখ্যা বের করার সমস্যা সমাধান করেছি কৌম্বিনেটরিক্স এবং সূত্র প্রয়োগ করে। আমরা এই সমস্যার C++ প্রোগ্রামও দেখেছি। একই প্রোগ্রাম C, Java, Python ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই আর্টিকেলটি সহায়ক পাবেন।

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

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

  3. C++ দিয়ে m বিজোড় সংখ্যা (Odd Numbers) ধারণকারী সাবঅ্যারে সংখ্যা বের করা

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