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

C++-এ মিনিমাম নাম্বার অফ স্কয়ার-ফ্রি ডিভাইজর


সমস্যা বিবরণ

একটি ইন্টিজার N দেওয়া আছে। মিনিমাম নাম্বার অফ স্কয়ার-ফ্রি ডিভাইজর বের করুন।

N-এর ফ্যাক্টরাইজেশন শুধু সেই ডিভাইজরগুলো দিয়ে গঠিত হতে হবে যা ফুল স্কয়ার নয়।

উদাহরণ

যদি N = 24 হয়, তবে ৩টি স্কয়ার-ফ্রি ফ্যাক্টর থাকবে:

ফ্যাক্টরস = 2 * 6 * 2

অ্যালগরিদম

  • N-এর বর্গমূল পর্যন্ত সব প্রাইম ফ্যাক্টর বের করুন
  • এখন, N-এর বর্গমূল থেকে কম বা সমান সব প্রাইম ফ্যাক্টর কনসিডার করুন এবং প্রতিটি প্রাইম ফ্যাক্টরের জন্য N-এ এর ম্যাক্সিমাম পাওয়ার বের করুন (যেমন 24-এ ২-এর ম্যাক্স পাওয়ার ৩)
  • আমরা জানি, যদি একটি প্রাইম ফ্যাক্টরের পাওয়ার N-এ ১-এর চেয়ে বড় হয়, তবে সেটি নিজের সাথে গ্রুপ করা যাবে না (যেমন 24-এ ২-এর পাওয়ার ৩, তাই 2x2=4 বা 2x2x2=8, 24-এর ফ্যাক্টরাইজেশনে থাকতে পারবে না কারণ সেগুলো স্কয়ার-ফ্রি নয়) যেহেতু সেগুলো কোনো পারফেক্ট স্কয়ার দিয়ে ডিভাইডেবল হবে
  • কিন্তু একটি প্রাইম ফ্যাক্টর অন্য প্রাইম ফ্যাক্টরের সাথে (শুধু একবার) গ্রুপ করা হলে সেটি কোনো পারফেক্ট স্কয়ার দিয়ে ডিভাইডেবল হবে না
  • এটি আমাদের ইন্টুইশন দেয় যে আন্সার হবে N-এ সব প্রাইম ফ্যাক্টরের ম্যাক্সিমাম পাওয়ারগুলোর ম্যাক্সিমাম

উদাহরণ

#include <iostream> 
#include <vector> 
#include <cstring> 
using namespace std; 
#define MAX 1005 

void getPrimes(vector<int>& primes) { 
    bool prime[MAX]; 
    memset(prime, true, sizeof(prime)); 
    for (int p = 2; p * p < MAX; p++) { 
        if (prime[p] == true) { 
            for (int i = p * 2; i < MAX; i += p) 
                prime[i] = false; 
        } 
    } 
    for (int p = 2; p < MAX; p++) 
        if (prime[p]) 
            primes.push_back(p); 
} 

int getMinimumSquareFreeDivisors(int n) { 
    vector<int> primes; 
    getPrimes(primes); 
    int maxCnt = 0; 
    for (int i = 0; i < primes.size() && primes[i] * primes[i] <= n; i++) { 
        if (n % primes[i] == 0) { 
            int tmp = 0; 
            while (n % primes[i] == 0) { 
                tmp++; 
                n /= primes[i]; 
            } 
            maxCnt = max(maxCnt, tmp); 
        } 
    } 
    if (maxCnt == 0) 
        maxCnt = 1; 
    return maxCnt; 
} 

int main() { 
    int n = 24; 
    cout << "Minimum number of square free divisors = " << getMinimumSquareFreeDivisors(n) << endl; 
    return 0; 
}

আউটপুট

যখন আপনি উপরের প্রোগ্রাম কম্পাইল ও এক্সিকিউট করবেন। এটি নিচের আউটপুট জেনারেট করবে:

Minimum number of square free divisors = 3

  1. দেওয়া সংখ্যার সেট বিট ব্যবহার করে ন্যূনতম সংখ্যা বের করা C++-তে

  2. সংখ্যাকে সম্পূর্ণ বর্গ করতে ন্যূনতম কত দিয়ে ভাগ করতে হবে তা বের করা C++-তে

  3. C++-এ ন্যূনতম পৃষ্ঠা বণ্টন (Allocate Minimum Pages)

  4. C++ এডাম নম্বর (Adam Number)