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

C++-এ সন্নিহিত এলিমেন্টগুলো যেন একে অপরকে ভাগ করে তোলে এমন অ্যারেগুলোর গণনা


দুটি ইন্টিজার one এবং another দেওয়া আছে। লক্ষ্য হলো সادات অ্যারেগুলোর সংখ্যা বের করা যাতে:

  • অ্যারেতে থাকা এলিমেন্টগুলো ১ থেকে another পর্যন্ত রেঞ্জে থাকে।

  • সকল সন্নিহিত এলিমেন্ট এমন থাকে যে arr[i], arr[i+1]-কে ভাগ করে তোলে অথবা arr[i+1], arr[i+2]-কে ভাগ করে তোলে — এভাবে চলতে থাকে।

  • অ্যারেতি দৈর্ঘ্য one।

উদাহরণ ১

ইনপুট

one = 3, another = 2

আউটপুট

সন্নিহিত এলিমেন্টগুলো যেন একে অপরকে ভাগ করে তোলে এমন অ্যারেগুলোর সংখ্যা: 8

ব্যাখ্যা

সম্ভব অ্যারেগুলো: [1,1,1], [1,1,2], [1,2,1], [1,2,2], [2,1,1], [2,1,2], [2,2,1], [2,2,2]

উদাহরণ ২

ইনপুট

one = 2, another = 3

আউটপুট

সন্নিহিত এলিমেন্টগুলো যেন একে অপরকে ভাগ করে তোলে 그런 অ্যারেগুলোর সংখ্যা: 7

ব্যাখ্যা

সম্ভব অ্যারেগুলো: [1,1], [2,2], [3,3], [1,2], [1,3], [2,2], [3,3]

প্রয়োগ করা পদ্ধতি

প্রতিটি অ্যারেতি প্রথম এলিমেন্ট যেকোনো সংখ্যা হতে পারে ১ থেকে another পর্যন্ত। পরবর্তী এলিমেন্টটি সবসময় আগের এলিমেন্টের গুণফল অথবা গুণনীয়ক হবে যাতে বিভাজ্যতার শর্ত পূরণ হয়। এছাড়া গুণফল বা গুণনียক another-র চেয়ে ছোট হতে হবে। ডাইনামিক প্রোগ্রামিং ব্যবহার করে গণনাগুলো সংরক্ষণ করা হয়। এর জন্য arr[][] অ্যারে ব্যবহার করা হয়। arr[1][another] হবে ১ কারণ সেগুলো একক এলিমেন্টের অ্যারে। arr[i][j] = arr[i-1][j] + আগের এলিমেন্টের গুণনীয়ক + আগের এলিমেন্টের গুণফল (another-র চেয়ে কম)।

  • one এবং another ইন্টিজার হিসেবে ইনপুট নিন।

  • adjacent_elements(int first, int second) ফাংশনটি অ্যারেগুলোর সংখ্যা রিটার্ন করে।

  • আরম্ভিক কাউন্ট ০ এবং অ্যারে arr[size][size] নিন।

  • memset দিয়ে সব কাউন্ট ০ করুন।

  • দুটি ভেক্টর নিন — vec গুণনীয়ক সংরক্ষণের জন্য এবং vec_2 গুণফল সংরক্ষণের জন্য।

  • দুটি নেস্টেড for লুপ দিয়ে i=1 থেকে second এবং j=2*i থেকে j=second পর্যন্ত ট্রুভার্স করুন, j-কে i দিয়ে বাড়ান।

  • vec[j]-এ i এবং vec_2[i]-এ j যোগ করুন। j লুপ শেষে vec[i]-এ i যোগ করুন।

  • for লুপ দিয়ে arr[1][i] সেট করুন।

  • আরেকবার অ্যারে ট্রুভার্স করুন এবং vec ও vec_2 থেকে গুণনীয়ক ও গুণফল যোগ করে arr[i][j] আপডেট করুন।

  • শেষে সকল arr[first][i] কাউন্টে যোগ করে vec[i] এবং vec_2[i] ক্লিয়ার করুন।

  • কাউন্ট রিটার্ন করুন ফলাফল হিসেবে।

উদাহরণ কোড

#include <bits/stdc++.h> 
using namespace std; 
#define size 1000 

int adjacent_elements(int first, int second) {
    int count = 0; 
    int arr[size][size]; 
    memset(arr, 0, sizeof arr); 
    vector<int> vec[size], vec_2[size]; 
    memset(vec, 0, sizeof vec); 
    memset(vec_2, 0, sizeof vec_2); 
    
    for (int i = 1; i <= second; i++) {
        for (int j = 2*i; j <= second; j += i) {
            vec[j].push_back(i); 
            vec_2[i].push_back(j); 
        } 
        vec[i].push_back(i); 
    } 
    
    for (int i = 1; i <= second; i++) {
        arr[1][i] = 1; 
    } 
    
    for (int i = 2; i <= first; i++) {
        for (int j = 1; j <= second; j++) {
            arr[i][j] = 0; 
            for (auto it: vec[j]) {
                arr[i][j] += arr[i-1][it]; 
            } 
            for (auto it : vec_2[j]) {
                arr[i][j] += arr[i-1][it]; 
            } 
        } 
    } 
    
    for (int i = 1; i <= second; i++) {
        count = count + arr[first][i]; 
        vec[i].clear(); 
        vec_2[i].clear(); 
    } 
    
    return count; 
} 

int main() { 
    int one = 2, another = 2; 
    cout << "সন্নিহিত এলিমেন্টগুলো যেন একে অপরকে ভাগ করে তোলে 그런 অ্যারেগুলোর সংখ্যা: " << adjacent_elements(one, another); 
    return 0; 
}

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের আউটপুটটি আসবে:

সন্নিহিত এলিমেন্টগুলো যেন একে অপরকে ভাগ করে তোলে 그런 অ্যারেগুলোর সংখ্যা: 4

  1. C++-এ সার্কুলার অ্যারেতে আঁচবিক উপাদান ছাড়া সর্বোচ্চ যোগফল বের করার পদ্ধতি

  2. C++-এ বাইনারি ম্যাট্রিক্সে ১ দ্বারা ব্লক করা ০ গণনা (Count 0s Blocked by 1s in Binary Matrix)

  3. সি++ প্রোগ্রাম: সংখ্যা বিভাজ্য করে এমন অঙ্কগুলোর গণনা (Count of Digits Dividing the Number)

  4. C++ ব্যবহার করে অ্যারেতে এমন এলিমেন্ট বের করা যেটি সব এলিমেন্টকে ভাগ করে দেয়