একটি অ্যারে 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