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

সメリカ প্রগ্রেশন (AP) সাবসিকোয়েন্সের গণনা একটি অ্যারেতে (C++)

একটি অ্যারে arr[] দেওয়া আছে যাতে ইন্টিজার এলিমেন্ট রয়েছে। লক্ষ্য হল অ্যারেতে থাকা ಅ্যারিথমেটিক প্রগ্রেশন (AP) সাবসিকোয়েন্সের সংখ্যা গণনা করা। arr[]-এর এলিমেন্ট들의 রেঞ্জ হলো [1, 1000000]।

খালি সিকোয়েন্স বা একক এলিমেন্টও এপি হিসেবে গণ্য হবে।

উদাহরণ দিয়ে বোঝা যাক

উদাহরণ ১

ইনপুট - arr[] = {1, 2, 3}

আউটপুট - অ্যারেতে AP (Arithmetic Progression) সাবসিকোয়েন্সের সংখ্যা: 8

ব্যাখ্যা - নিচের সাবসিকোয়েন্সগুলো AP বানাবে:

{}, {1}, {2}, {3}, {1,2}, {2,3}, {1,3}, {1,2,3}

উদাহরণ ২

ইনপুট - arr[] = {2, 4, 5, 8}

আউটপুট - অ্যারেতে AP (Arithmetic Progression) সাবসিকোয়েন্সের সংখ্যা: 12

ব্যাখ্যা - নিচের সাবসিকোয়েন্সগুলো AP বানাবে:

{}, {2}, {4}, {5}, {8}, {2,4}, {2,5}, {2,8}, {4,5}, {4,8}, {5,8}, {2,5,8}

প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • একটি খালি সিকোয়েন্সও একটি AP।
  • একক মানও একটি AP।
  • অ্যারেতে ন্যূনতম এবং সর্বোচ্চ মান বের করুন (min_val এবং max_val)। সব AP সাবসিকোয়েন্সের কমন ডিফারেন্স [min_val - max_val, max_val - min_val] রেঞ্জের মধ্যে থাকবে।
  • প্রতিটি কমন ডিফারেন্সের জন্য ডাইনামিক প্রোগ্রামিং ব্যবহার করে সাবসিকোয়েন্স খুঁজুন এবং arr_2[size]-এ সংরক্ষণ করুন।
  • দৈর্ঘ্য ২ বা তার বেশি সাবসিকোয়েন্সের সংখ্যা হবে arr_2[i]-1 এর সমষ্টি, যেখানে i হলো [0,2] এবং ডিফারেন্স D।
  • arr_2[i] = 1 + sum(arr_2[j]) যেখানে i < j এবং arr_2[j] + D = arr_2[i]।
  • দ্রুত সমাধানের জন্য যোগফল arr_3[max_size]-এ সংরক্ষণ করুন।
  • ইন্টিজার অ্যারে arr[] ইনপুট নিন।
  • ফাংশন AP_subsequence(int arr[], int size) ইনপুট অ্যারে গ্রহণ করে এবং AP সাবসিকোয়েন্সের সংখ্যা রিটার্ন করে।
  • প্রাথমিক কাউন্ট ০ ধরুন।
  • ভেরিয়েবল max_val, min_val, arr_2[size] (সাবসিকোয়েন্স কাউন্ট সংরক্ষণের জন্য) এবং arr_3[max_size] (যোগফল সংরক্ষণের জন্য) নিন।
  • অ্যারে ট্রাভার্স করে সর্বোচ্চ এবং ন্যূনতম এলিমেন্ট বের করুন।
  • count = size + 1 নিন (একক এলিমেন্ট AP এবং খালি AP-এর জন্য)।
  • সর্বোচ্চ ডিফারেন্স diff_max = max_val - min_val এবং ন্যূনতম ডিফারেন্স diff_min = min_val - max_val হিসাব করুন।
  • j=0 থেকে j
  • arr_2[j] = 1 সেট করুন।
  • যদি arr[j] - i >= 1 এবং arr[j] - i <= 1000000 হয়, তবে arr_2[j] += arr_3[arr[j] - i]।
  • count-এ arr_2[j]-1 যোগ করুন।
  • সাম আপডেট করুন: arr_3[arr[j]] = arr_3[arr[j]] + arr_2[j]।
  • শেষে count রিটার্ন করুন।

উদাহরণ কোড

#include <bits/stdc++.h>
using namespace std;
#define max_size 10000

int AP_subsequence(int arr[], int size) {
    int count = 0;
    int max_val = INT_MAX;
    int min_val = INT_MIN;
    int arr_2[size];
    int arr_3[max_size];

    for (int i = 0; i < size; i++) {
        max_val = min(max_val, arr[i]);
        min_val = max(min_val, arr[i]);
    }

    count = size + 1;
    int diff_max = max_val - min_val;
    int diff_min = min_val - max_val;

    for (int i = diff_max; i <= diff_min; i++) {
        memset(arr_3, 0, sizeof arr_3);
        for (int j = 0; j < size; j++) {
            arr_2[j] = 1;
            if (arr[j] - i >= 1) {
                if (arr[j] - i <= 1000000) {
                    arr_2[j] += arr_3[arr[j] - i];
                }
            }
            count += arr_2[j] - 1;
            arr_3[arr[j]] = arr_3[arr[j]] + arr_2[j];
        }
    }
    return count;
}

int main() {
    int arr[] = {1, 1, 6, 7, 8};
    int size = sizeof(arr) / sizeof(arr[0]);
    cout << "Count of AP (Arithmetic Progression) Subsequences in an array are: " << AP_subsequence(arr, size);
    return 0;
}

উপরের কোড রান করলে নিচের আউটপুটটি পাওয়া যাবে:

আউটপুট

Count of AP (Arithmetic Progression) Subsequences in an array are: 17
  1. একটি এলিমেন্ট যোগ করে অ্যারেকে আ্যারিথমেটিক প্রোগ্রেশনে কনভার্ট করা C++-তে

  2. C++ তে সর্টেড অ্যারেতে এবসোলিউট ডিস্টিংক্ট কাউন্ট

  3. C++ প্রোগ্রাম: অ্যারেতে ইনভার্শন কাউন্ট করা

  4. C++-এ পয়েন্টার অর্থমেটিক ব্যবহার করে অ্যারে সমষ্টি বের করা