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

সাব-ম্যাট্রিক্সের সম k দিয়ে বিভাজ্য হলে তাদের সংখ্যা গণনা (C++)

একটি row x col ম্যাট্রিক্স ইনপুট হিসেবে দেওয়া আছে। লক্ষ্য হল ম্যাট্রিক্সের ভিতরে যেসব সাব-ম্যাট্রিক্সের এলিমেন্টগুলোর সম k দিয়ে বিভাজ্য, তাদের সংখ্যা বের করা।

যদি ম্যাট্রিক্স mat[3][3] এবং k=4 হয়, তবে সাব-ম্যাট্রিক্সগুলো নিচে দেখানো হলো।

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

উদাহরণ ১

ইনপুট - matrix[3][3] = {{1,1,1}, {2,2,2}, {3,3,3}}, k=4

আউটপুট - সম k দিয়ে বিভাজ্য সাব-ম্যাট্রিক্সের সংখ্যা: ৪

ব্যাখ্যা - সাব-ম্যাট্রিক্সগুলো উপরে দেখানো হলো।

উদাহরণ ২

ইনপুট - matrix[3][3] = {{1,1,1}, {2,2,2}, {3,3,3}}, k=12

আউটপুট - সম k দিয়ে বিভাজ্য সাব-ম্যাট্রিক্সের সংখ্যা: ৪

ব্যাখ্যা - সাব-ম্যাট্রিক্সগুলো নিচে দেখানো হলো।

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

এই পদ্ধতিতে ম্যাট্রিক্স বাম থেকে ডান ট্রাভার্স করা হয়। প্রতিটি লেফট এবং রাইট কলাম পেয়ারের জন্য সাব-ম্যাট্রিক্সের এলিমেন্টগুলো ১ডি অ্যারে arr[]-এ যোগ করা হয় এবং আলাদাভাবে তাদের সম এবং সাবঅ্যারে যাদের সম k দিয়ে বিভাজ্য, সেগুলো হিসাব করা হয়।

ফাংশন check_val() ১ডি অ্যারে নেয় সাব-ম্যাট্রিক্সের এলিমেন্টগুলোর। ক্যুমুলেটিভ সম হিসাব করে k দিয়ে রিমেইনডার চেক করে এবং রিমেইনডারের ফ্রিকোয়েন্সি অ্যারে arr_2[]-এ সংরক্ষণ করে।

  • ম্যাট্রিক্স matrix[row][col] এবং ইন্টিজার k ইনপুট নিন।
  • ফাংশন check_val(int arr[], int size, int k) সাব-ম্যাট্রিক্সের এলিমেন্ট অ্যারে নিয়ে সাবঅ্যারে যাদের সম k দিয়ে বিভাজ্য, তাদের কাউন্ট রিটার্ন করে।
  • count এবং temp ০ ইনিশিয়ালাইজ করুন।
  • অ্যারে arr_2[] রিমেইনডার ফ্রিকোয়েন্সি সংরক্ষণের জন্য।
  • i=0 থেকে size-১ পর্যন্ত ফর লুপ: temp += arr[i], arr_2[((temp%k)+k)%k]++ (নেগেটিভ সমের জন্য দুবার মড)।
  • আবার i=0 থেকে k-১ পর্যন্ত লুপ: যদি arr_2[i] > 1 হয় তবে count += (arr_2[i]*(arr_2[i]-1))/2।
  • শেষে count += arr_2[0]।
  • ফাংশন matrix_divisible(int matrix[row][col], int size, int k) ইনপুট সাব-ম্যাট্রিক্স নিয়ে ফলাফল রিটার্ন করে।
  • প্রাথমিক কাউন্ট ০, টেম্পোরারি অ্যারে arr[size]।
  • দুইটি FOR লুপ: লেফট কলাম i, রাইট কলাম j।
  • arr[temp] += matrix[temp][j] দিয়ে সম হিসাব করুন।
  • count += check_val(arr, size, k)।
  • সব লুপ শেষে count রিটার্ন করুন।

উদাহরণ কোড

#include <bits/stdc++.h>
using namespace std;
#define row 10
#define col 10

int check_val(int arr[], int size, int k) {
    int count = 0;
    int temp = 0;
    int arr_2[k];
    memset(arr_2, 0, sizeof(arr_2));
    for (int i = 0; i < size; i++) {
        temp = temp + arr[i];
        arr_2[((temp % k) + k) % k]++;
    }
    for (int i = 0; i < k; i++) {
        if (arr_2[i] > 1) {
            count += (arr_2[i] * (arr_2[i] - 1)) / 2;
        }
    }
    count = count + arr_2[0];
    return count;
}

int matrix_divisible(int matrix[row][col], int size, int k) {
    int count = 0;
    int arr[size];
    for (int i = 0; i < size; i++) {
        memset(arr, 0, sizeof(arr));
        for (int j = i; j < size; j++) {
            for (int temp = 0; temp < size; ++temp) {
                arr[temp] += matrix[temp][j];
            }
            count = count + check_val(arr, size, k);
        }
    }
    return count;
}

int main() {
    int matrix[row][col] = {{2,4,-1},{6,1,-9},{2,2,1}};
    int size = 3, k = 4;
    cout << "Count of sub-matrices having sum divisible 'k' are: " << matrix_divisible(matrix, size, k);
    return 0;
}

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

আউটপুট

Count of sub-matrices having sum divisible 'k' are: 7
  1. C++-এ দুটি অ্যার থেকে একই অঙ্কযোগফল নিয়ে স্বতন্ত্র জোড়া গণনা

  2. C++-এ অ্যারেতে ভাগযোগ্য জোড়া গণনা

  3. C++-এ তিন দিয়ে বিভাজ্য সর্বোচ্চ যোগফল

  4. C++-এ যোগফল k দিয়ে বিভাজ্য সব সাব-অ্যারে গণনা