Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 합으로 나눌 수 있는 'k'를 갖는 부분행렬 수 세기

<시간/>

행 x 열 행렬이 입력으로 주어집니다. 목표는 그 부분행렬의 요소들의 합이 정수 k로 나누어질 수 있도록 행렬[row][col] 내의 모든 부분행렬을 찾는 것입니다.

행렬이 mat[3][3]이고 k가 4이면 부분행렬은 다음과 같습니다.-

예를 들어 이해합시다.

예를 들어

입력 - 행렬[3][3] ={ {1,1,1}, {2,2,2}, {3,3,3} } k=4

출력 - 합이 'k'인 부분행렬의 개수는 다음과 같습니다. 4

설명 - 부분행렬은 위와 같을 것입니다.

입력 - 행렬[3][3] ={ {1,1,1}, {2,2,2}, {3,3,3} } k=12

출력 - 합이 'k'인 부분행렬의 개수는 다음과 같습니다. 4

설명 - 하위 행렬은 아래와 같이 표시됩니다.-

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

이 접근 방식에서 우리는 행렬을 왼쪽에서 오른쪽으로 순회하고 왼쪽 및 오른쪽 열의 각 쌍에 대해 배열 arr[]에 부분 행렬의 요소를 추가하고 k로 나눌 수 있는 합을 갖는 요소와 부분 배열의 합을 별도로 계산합니다.

check_val() 함수는 부분행렬의 요소가 있는 배열을 1D 배열로 취합니다. 이제 누적 합계를 계산하고 k로 나머지를 확인하고 나머지 빈도를 배열 arr_2[]에 저장합니다.

  • 행렬[row][col]과 정수 k를 입력으로 받습니다.
  • check_val(int arr[], int size, int k) 함수는 부분행렬의 요소 중 arr[]을 가져와 k로 나눌 수 있는 합계를 갖는 arr 내의 모든 부분 배열의 개수를 반환합니다.
  • 변수 개수와 온도를 0으로 취합니다.
  • k가 있는 누적 합계의 나머지 빈도를 저장하기 위해 배열 arr_2[]를 사용합니다.
  • i=0에서 i
  • for 루프 트래버스 주파수 배열 arr_2[]를 다시 사용하고 각 값에 대해 arr_2[i] * (arr_2[i] - 1)) / 2를 추가하여 가능한 모든 하위 배열의 수로 계산합니다.
  • 끝에 rr_2[0]을 추가하여 계산합니다.
  • 함수 matrix_divisible(int matrix[row][col], int size, int k)는 입력 부분행렬을 받아 k로 나눌 수 있는 합을 갖는 모든 부분행렬의 개수를 반환합니다.
  • 초기 카운트를 0으로 합니다.
  • 임시 배열 arr[크기]를 가져옵니다.
  • 두 개의 for 루프를 사용하여 왼쪽 열 인덱스 i와 오른쪽 열 인덱스 j를 설정합니다.
  • 요소의 합을 arr[temp]+=matrix[temp][j]로 계산합니다.
  • arr[]의 하위 배열 수에 대해 check_val(arr, size, k)을 추가하여 계산합니다.
  • 모든 for 루프가 끝나면 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