একটি অ্যারে arr[] এবং একটি ইন্টিজার k ইনপুট হিসেবে দেওয়া আছে। লক্ষ্য হলো arr[]-এর সেই সাবঅ্রেগুলোর সংখ্যা বের করা যাদের এলিমেন্টগুলোর গুণফল k দিয়ে বিভাজ্য।
ইনপুট
arr[] = {2, 1, 5, 8} k=4
আউটপুট
Count of sub-arrays whose product is divisible by k are: 4
ব্যাখ্যা
সাবঅ্রেগুলো হবে: [ 8 ], [ 5,8 ], [ 1,5,8 ], [ 2,1,5,8 ]।
ইনপুট
arr[] = {7,1,9,7} k=9
আউটপুট
Count of sub-arrays whose product is divisible by k are: 6
ব্যাখ্যা
সাবঅ্রেগুলো হবে: [ 9 ], [ 9,7 ], [ 1,9 ], [ 1,9,7 ], [ 7,1,9 ], [ 7,1,9,7 ]।
প্রোগ্রামে ব্যবহৃত পদ্ধতি:
সহজ পদ্ধতি (Naive Approach)
এই পদ্ধতিতে, সহজেই অ্যারের উপর দুটি ফর লুপ দিয়ে ট্রভারস করা হয় এবং প্রতিটি সাবঅ্রে জন্য ইন্ডেক্স i এবং j এর মধ্যে 엘িমেন্টগুলোর গুণফল k দিয়ে বিভাজ্য কিনা চেক করা হয়। হ্যাঁ হলে কাউন্ট বাড়ানো হয়।
- ইন্টিজার অ্যারে
arr[]এবং k ইনপুট নেওয়া হয়। product_k(int arr[], int size, int k)ফাংশন অ্যারে এবং k নিয়ে কাউন্ট রিটার্ন করে।- ইনিশিয়াল কাউন্ট ০।
i=0থেকেi<sizeএবংj=iথেকেj<sizeএবংk=iথেকেk<=jট্রভারস।- প্রতিটি সাবঅ্রে
arr[i to j]এর জন্যarr[k]গুণ করেtemp-এ রাখা হয়। temp % k == 0হলেcount++।- তিনটি লুপ শেষে
countরিটার্ন।
দক্ষ পদ্ধতি (Efficient Approach)
এই পদ্ধতিতে প্রতিটি সাবঅ্রে ট্রভারস না করে, সেগমেন্ট ট্রি-তে গুণফলগুলো স্টোর করা হয়। এখন এই ট্রি থেকে k দিয়ে বিভাজ্য গুণফলগুলো ব্যবহার করে কাউন্ট বাড়ানো হয়।
- ইন্টিজার অ্যারে
arr[]এবং k ইনপুট নেওয়া হয়। - সেগমেন্ট ট্রি ইমপ্লিমেন্ট করা হয় অ্যারে
arr_2[4 * size_2]হিসেবে। set_in(int fit, int first, int last, const int* arr, int k)ফাংশন সেগমেন্ট ট্রি বিল্ড করে গুণফলের জন্য।check(int fit, int first, int last, int start, int end, int k)ফাংশনstartএবংendএর মধ্যে সাবঅ্রের গুণফল বের করে।- শর্তমতো রিটার্ন ১ বা মডুলো k ভ্যালু।
- লেভেল ক্যালকুলেশন:
level = (first + last) >> 1। - রিকারসিভ কল
check()লেভেল এবং লেভেল+১ এর জন্য এবংset_1,set_2-এ স্টোর। count = (set_1 * set_2) % kরিটার্ন।product_k(int arr[], int size, int k)ফাংশন কাউন্ট রিটার্ন করে।- দুই ফর লুপে
i=0থেকেsize,j=iথেকেsize।temp = check(1, 0, size-1, i, j, k)। temp == 0হলেcount++।- ফলাফল
countরিটার্ন।
উদাহরণ (সহজ পদ্ধতি)
#include <bits/stdc++.h>
using namespace std;
int product_k(int arr[], int size, int k) {
int count = 0;
for (int i = 0; i < size; i++) {
for (int j = i; j < size; j++) {
int temp = 1;
for (int k = i; k <= j; k++) {
temp = temp * arr[k];
}
if (temp % k == 0) {
count++;
}
}
}
return count;
}
int main() {
int arr[] = {2, 1, 5, 8, 10, 12};
int size = sizeof(arr) / sizeof(arr[0]);
int k = 2;
cout << "Count of sub-arrays whose product is divisible by k are: " << product_k(arr, size, k);
return 0;
}
আউটপুট
Count of sub-arrays whose product is divisible by k are: 18
উদাহরণ (দক্ষ পদ্ধতি)
#include <bits/stdc++.h>
using namespace std;
#define size_2 100002
int arr_2[4 * size_2];
void set_in(int fit, int first, int last, const int* arr, int k) {
if (first == last) {
arr_2[fit] = (1LL * arr[first]) % k;
return;
}
int level = (first + last) >> 1;
set_in(2 * fit, first, level, arr, k);
set_in(2 * fit + 1, level + 1, last, arr, k);
arr_2[fit] = (arr_2[2 * fit] * arr_2[2 * fit + 1]) % k;
}
int check(int fit, int first, int last, int start, int end, int k) {
if (first > last) return 1;
if (first > end) return 1;
if (last < start) return 1;
if (first >= start) {
if (last <= end) {
return arr_2[fit] % k;
}
}
int level = (first + last) >> 1;
int set_1 = check(2 * fit, first, level, start, end, k);
int set_2 = check(2 * fit + 1, level + 1, last, start, end, k);
int count = (set_1 * set_2) % k;
return count;
}
int product_k(int arr[], int size, int k) {
int count = 0;
for (int i = 0; i < size; i++) {
for (int j = i; j < size; j++) {
int temp = check(1, 0, size - 1, i, j, k);
if (temp == 0) {
count++;
}
}
}
return count;
}
int main() {
int arr[] = {2, 1, 5, 8, 10, 12};
int size = sizeof(arr) / sizeof(arr[0]);
int k = 2;
set_in(1, 0, size - 1, arr, k);
cout << "Count of sub-arrays whose product is divisible by k are: " << product_k(arr, size, k);
return 0;
}
আউটপুট
Count of sub-arrays whose product is divisible by k are: 18