দুটি ইন্টিজার 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