Count of odd sum Submatrix with odd element count in the Matrix
Last Updated :
11 Nov, 2023
Given a matrix mat[][] of size N x N, the task is to count the number of submatrices with the following properties:
- The sum of all elements in the submatrix is odd.
- The number of elements in the submatrix is odd.
Examples:
Input: mat[][] = {{1, 2, 3}, {7, 5, 9}, {6, 8, 10}}
Output: 8
Explanation: As here total 8 submatrix is available in given matrix in which no. of elements is odd and sum of elements is also odd list of that matrix are {{1}}, {{3}}, {{7}}, {{5}}, {{9}}, {{7, 5, 9}}, {{2}, {5}, {8}}, {{1, 2, 3}, {7, 5, 9}, {5, 9, 6}}
Input: mat[][] = {{15, 2, 31}, {17, 11, 12}, {16, 51, 10}, {13, 52, 18}}
Output: 14
Naive Approach: We can solve this problem using a brute force approach, where we consider all possible submatrices of the given matrix and check if they satisfy the given properties.
Below is the code for the above approach:
C++
// C++ code for the above approach:
#include <bits/stdc++.h>
using namespace std;
int oddSumOddElementCountSubmatrix(
vector<vector<int> >& mat)
{
// Size of given 2-D matrix
int n = mat.size();
int count = 0;
// Here we need all submatrix which
// contains odd no. of element in them.
// So all the matrix whose size is in
// form 1*3, 1*5, 1*7, 3*1, 3*3, 3*5,
// 3*7, 5*1, ... are valid submatrix
// now we need to check for that sum
// of element present in that
// submatrix is odd or not
// So this nested 4 for loop generates
// all submatrix with size as
// mentioned above
for (int rsize = 1; rsize <= n; rsize += 2) {
for (int csize = 1; csize <= n; csize += 2) {
for (int row = 0; row + rsize <= n; row++) {
for (int col = 0; col + csize <= n; col++) {
// Now do summation of
// element present in
// that subarray and if
// it's odd increment
// the count
int sum = 0;
for (int i = row; i < row + rsize;
i++) {
for (int j = col; j < col + csize;
j++) {
sum += mat[i][j];
}
}
if (sum % 2 == 1) {
count++;
}
}
}
}
}
// Return answer
return count;
}
// Drivers code
int main()
{
vector<vector<int> > mat
= { { 1, 2, 3 }, { 7, 5, 9 }, { 6, 8, 10 } };
// Function Call
cout << "Number of odd sum submatrices with odd number "
"of elements: "
<< oddSumOddElementCountSubmatrix(mat) << "\n";
return 0;
}
Java
import java.util.*;
public class Main {
public static int oddSumOddElementCountSubmatrix(int[][] mat) {
// Size of given 2-D matrix
int n = mat.length;
int count = 0;
// Here we need all submatrix which
// contains odd no. of element in them.
// So all the matrix whose size is in
// form 1*3, 1*5, 1*7, 3*1, 3*3, 3*5,
// 3*7, 5*1, ... are valid submatrix
// now we need to check for that sum
// of element present in that
// submatrix is odd or not
// So this nested 4 for loop generates
// all submatrix with size as
// mentioned above
for (int rsize = 1; rsize <= n; rsize += 2) {
for (int csize = 1; csize <= n; csize += 2) {
for (int row = 0; row + rsize <= n; row++) {
for (int col = 0; col + csize <= n; col++) {
// Now do summation of
// element present in
// that subarray and if
// it's odd increment
// the count
int sum = 0;
for (int i = row; i < row + rsize; i++) {
for (int j = col; j < col + csize; j++) {
sum += mat[i][j];
}
}
if (sum % 2 == 1) {
count++;
}
}
}
}
}
// Return answer
return count;
}
// Drivers code
public static void main(String[] args) {
int[][] mat = { { 1, 2, 3 }, { 7, 5, 9 }, { 6, 8, 10 } };
// Function Call
System.out.println("Number of odd sum submatrices with odd number of elements: " + oddSumOddElementCountSubmatrix(mat));
}
}
//This code is contributed by tushar rokade
Python3
def oddSumOddElementCountSubmatrix(mat):
# Size of given 2-D matrix
n = len(mat)
count = 0
# Here we need all submatrix which
# contains odd no. of element in them.
# So all the matrix whose size is in
# form 1*3, 1*5, 1*7, 3*1, 3*3, 3*5,
# 3*7, 5*1, ... are valid submatrix
# now we need to check for that sum
# of element present in that
# submatrix is odd or not
# So this nested 4 for loop generates
# all submatrix with size as
# mentioned above
for rsize in range(1, n+1, 2):
for csize in range(1, n+1, 2):
for row in range(n-rsize+1):
for col in range(n-csize+1):
# Now do summation of
# element present in
# that subarray and if
# it's odd increment
# the count
subMatSum = 0
for i in range(row, row+rsize):
for j in range(col, col+csize):
subMatSum += mat[i][j]
if subMatSum % 2 == 1:
count += 1
# Return answer
return count
# Driver code
mat = [[1, 2, 3], [7, 5, 9], [6, 8, 10]]
print("Number of odd sum submatrices with odd number of elements: ", oddSumOddElementCountSubmatrix(mat))
C#
// C# code for above approach
using System;
public class GFG {
public static int oddSumOddElementCountSubmatrix(int[][] mat) {
// Size of given 2-D matrix
int n = mat.Length;
int count = 0;
// Here we need all submatrix which
// contains odd no. of element in them.
// So all the matrix whose size is in
// form 1*3, 1*5, 1*7, 3*1, 3*3, 3*5,
// 3*7, 5*1, ... are valid submatrix
// now we need to check for that sum
// of element present in that
// submatrix is odd or not
// So this nested 4 for loop generates
// all submatrix with size as
// mentioned above
for (int rsize = 1; rsize <= n; rsize += 2) {
for (int csize = 1; csize <= n; csize += 2) {
for (int row = 0; row + rsize <= n; row++) {
for (int col = 0; col + csize <= n; col++) {
// Now do summation of
// element present in
// that subarray and if
// it's odd increment
// the count
int sum = 0;
for (int i = row; i < row + rsize; i++) {
for (int j = col; j < col + csize; j++) {
sum += mat[i][j];
}
}
if (sum % 2 == 1) {
count++;
}
}
}
}
}
// Return answer
return count;
}
// Drivers code
public static void Main() {
int[][] mat = new int[][] { new int[] { 1, 2, 3 },
new int[] { 7, 5, 9 },
new int[] { 6, 8, 10 } };
// Function Call
Console.WriteLine("Number of odd sum submatrices with odd number of elements: " +
oddSumOddElementCountSubmatrix(mat));
}
}
// This code is contributed by Vaibhav Nandan
JavaScript
function oddSumOddElementCountSubmatrix(mat) {
// Size of given 2-D matrix
let n = mat.length;
let count = 0;
// Here we need all submatrix which
// contains odd no. of element in them.
// So all the matrix whose size is in
// form 1*3, 1*5, 1*7, 3*1, 3*3, 3*5,
// 3*7, 5*1, ... are valid submatrix
// now we need to check for that sum
// of element present in that
// submatrix is odd or not
// So this nested 4 for loop generates
// all submatrix with size as
// mentioned above
for (let rsize = 1; rsize <= n; rsize += 2) {
for (let csize = 1; csize <= n; csize += 2) {
for (let row = 0; row + rsize <= n; row++) {
for (let col = 0; col + csize <= n; col++) {
// Now do summation of
// element present in
// that subarray and if
// it's odd increment
// the count
let sum = 0;
for (let i = row; i < row + rsize; i++) {
for (let j = col; j < col + csize; j++) {
sum += mat[i][j];
}
}
if (sum % 2 === 1) {
count++;
}
}
}
}
}
// Return answer
return count;
}
// Test case
let mat = [[1, 2, 3], [7, 5, 9], [6, 8, 10]];
console.log("Number of odd sum submatrices with odd number of elements: " + oddSumOddElementCountSubmatrix(mat));
OutputNumber of odd sum submatrices with odd number of elements: 8
Time Complexity: O(N6), as 6 nested for loop requires to make matrix as required
Auxiliary Space: O(1), no extra space used.
Efficient Approach: To solve the problem follow the below idea:
- To optimize the solution, we can use a technique called prefix sums. We can precompute the sum of all elements in the matrix up to a particular row and column and store it in a separate matrix. This precomputation will allow us to calculate the sum of any submatrix in constant time.
- Once we have precomputed the prefix sums, we can iterate over all possible submatrices and check if they satisfy the above properties. To check if the sum of elements in a submatrix is odd, we can subtract the prefix sum of the bottom-right corner from the prefix sum of the top-left corner. If the difference is odd, the sum of the submatrix is odd.
- To check if the number of elements in a submatrix is odd, we can count the number of rows and columns in the submatrix and check if their product is odd.
Below are the steps for the above approach:
- Initialize a prefix sum matrix with 0, of the same size as the given matrix.
- Precompute the prefix sums of all elements up to each row and column in the prefix sum matrix.
- prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + matrix[i - 1][j - 1].
- Iterate over all possible submatrices in the given matrix.
- For each submatrix, calculate the sum of its elements using the prefix sum matrix.
- If the sum is odd, count the number of elements in the submatrix.
- If the number of elements is odd, increment the counter.
- Return the final count.
Below is the code for the above approach:
C++
// C++ code for the above approach:
#include <bits/stdc++.h>
using namespace std;
int countOddSumSubmatrices(vector<vector<int> >& matrix)
{
int n = matrix.size();
int m = matrix[0].size();
int count = 0;
// Initialize prefix sum matrix
vector<vector<int> > prefixSum(n + 1,
vector<int>(m + 1, 0));
// Precompute prefix sums
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
prefixSum[i][j] = prefixSum[i - 1][j]
+ prefixSum[i][j - 1]
- prefixSum[i - 1][j - 1]
+ matrix[i - 1][j - 1];
}
}
// Iterate over all submatrices
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
for (int k = i; k <= n; k++) {
for (int l = j; l <= m; l++) {
// Calculate sum of
// submatrix
int sum = prefixSum[k][l]
- prefixSum[i - 1][l]
- prefixSum[k][j - 1]
+ prefixSum[i - 1][j - 1];
// Check if sum is odd
// and number of
// elements is odd
if (sum % 2 == 1
&& ((k - i + 1) * (l - j + 1)) % 2
== 1) {
count++;
}
}
}
}
}
return count;
}
// Drivers code
int main()
{
vector<vector<int> > matrix
= { { 1, 2, 3 }, { 7, 5, 9 }, { 6, 8, 10 } };
int count = countOddSumSubmatrices(matrix);
// Function Call
cout << "Number of odd sum submatrices with odd number "
"of elements: "
<< count << endl;
return 0;
}
Java
import java.util.*;
public class Main {
public static int countOddSumSubmatrices(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
int count = 0;
// Initialize prefix sum matrix
int[][] prefixSum = new int[n + 1][m + 1];
// Precompute prefix sums
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
prefixSum[i][j] = prefixSum[i - 1][j]
+ prefixSum[i][j - 1]
- prefixSum[i - 1][j - 1]
+ matrix[i - 1][j - 1];
}
}
// Iterate over all submatrices
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
for (int k = i; k <= n; k++) {
for (int l = j; l <= m; l++) {
// Calculate sum of submatrix
int sum = prefixSum[k][l]
- prefixSum[i - 1][l]
- prefixSum[k][j - 1]
+ prefixSum[i - 1][j - 1];
// Check if sum is odd and the number of elements is odd
if (sum % 2 == 1
&& ((k - i + 1) * (l - j + 1)) % 2 == 1) {
count++;
}
}
}
}
}
return count;
}
public static void main(String[] args) {
int[][] matrix = {{1, 2, 3}, {7, 5, 9}, {6, 8, 10}};
int count = countOddSumSubmatrices(matrix);
// Function Call
System.out.println("Number of odd sum submatrices with an odd number of elements: " + count);
}
}
Python3
def count_odd_sum_submatrices(matrix):
n = len(matrix)
m = len(matrix[0])
count = 0
# Initialize the prefix sum matrix
prefix_sum = [[0] * (m + 1) for _ in range(n + 1)]
# Precompute prefix sums
for i in range(1, n + 1):
for j in range(1, m + 1):
prefix_sum[i][j] = prefix_sum[i - 1][j] + prefix_sum[i][j - 1] - prefix_sum[i - 1][j - 1] + matrix[i - 1][j - 1]
# Iterate over all submatrices
for i in range(1, n + 1):
for j in range(1, m + 1):
for k in range(i, n + 1):
for l in range(j, m + 1):
# Calculate the sum of the submatrix
submatrix_sum = prefix_sum[k][l] - prefix_sum[i - 1][l] - prefix_sum[k][j - 1] + prefix_sum[i - 1][j - 1]
# Check if the sum is odd and the number of elements is odd
if submatrix_sum % 2 == 1 and ((k - i + 1) * (l - j + 1)) % 2 == 1:
count += 1
return count
# Driver's code
if __name__ == "__main__":
matrix = [
[1, 2, 3],
[7, 5, 9],
[6, 8, 10]
]
count = count_odd_sum_submatrices(matrix)
# Function Call
print(f"Number of odd sum submatrices with an odd number of elements: {count}")
C#
using System;
class GFG
{
static int countOddSumSubmatrices(int[][] matrix)
{
int n = matrix.Length;
int m = matrix[0].Length;
int count = 0;
// Initialize prefix sum matrix
int[][] prefixSum = new int[n + 1][];
for (int i = 0; i <= n; i++)
{
prefixSum[i] = new int[m + 1];
}
// Precompute prefix sums
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
prefixSum[i][j] = prefixSum[i - 1][j]
+ prefixSum[i][j - 1]
- prefixSum[i - 1][j - 1]
+ matrix[i - 1][j - 1];
}
}
// Iterate over all submatrices
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
for (int k = i; k <= n; k++)
{
for (int l = j; l <= m; l++)
{
// Calculate sum of submatrix
int sum = prefixSum[k][l]
- prefixSum[i - 1][l]
- prefixSum[k][j - 1]
+ prefixSum[i - 1][j - 1];
// Check if sum is odd and number of elements is odd
if (sum % 2 == 1
&& ((k - i + 1) * (l - j + 1)) % 2 == 1)
{
count++;
}
}
}
}
}
return count;
}
public static void Main()
{
int[][] matrix = {
new int[] { 1, 2, 3 },
new int[] { 7, 5, 9 },
new int[] { 6, 8, 10 }
};
int count = countOddSumSubmatrices(matrix);
// Function Call
Console.WriteLine("Number of odd sum submatrices with odd number of elements: " + count);
}
}
JavaScript
function countOddSumSubmatrices(matrix) {
const n = matrix.length;
const m = matrix[0].length;
let count = 0;
// Initialize prefix sum matrix
const prefixSum = new Array(n + 1).fill(0).map(() => new Array(m + 1).fill(0));
// Precompute prefix sums
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= m; j++) {
prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + matrix[i - 1][j - 1];
}
}
// Iterate over all submatrices
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= m; j++) {
for (let k = i; k <= n; k++) {
for (let l = j; l <= m; l++) {
// Calculate sum of submatrix
const sum = prefixSum[k][l] - prefixSum[i - 1][l] - prefixSum[k][j - 1] + prefixSum[i - 1][j - 1];
// Check if sum is odd and the number of elements is odd
if (sum % 2 === 1 && ((k - i + 1) * (l - j + 1)) % 2 === 1) {
count++;
}
}
}
}
}
return count;
}
// Driver code
const matrix = [
[1, 2, 3],
[7, 5, 9],
[6, 8, 10]
];
const count = countOddSumSubmatrices(matrix);
// Function call
console.log("Number of odd sum submatrices with odd number of elements: " + count);
OutputNumber of odd sum submatrices with odd number of elements: 8
Time Complexity: O(N4), as 4 nested for loop
Auxiliary Space: O(N2), extra space needed for prefix matrix.
Similar Reads
Count of submatrix with sum X in a given Matrix Given a matrix of size N x M and an integer X, the task is to find the number of sub-squares in the matrix with sum of elements equal to X.Examples: Input: N = 4, M = 5, X = 10, arr[][]={{2, 4, 3, 2, 10}, {3, 1, 1, 1, 5}, {1, 1, 2, 1, 4}, {2, 1, 1, 1, 3}} Output: 3 Explanation: {10}, {{2, 4}, {3, 1}
15+ min read
Count rows with sum exceeding sum of the remaining Matrix Given a matrix mat[][] of dimensions N * M, the task is to count the number of rows whose sum exceeds the sum of the remaining elements of the Matrix. Examples: Input: mat[][] = {{1, 5}, {2, 3}}Output: 1Explanation: Sum of elements of the first row {1, 5} exceeds the sum of the remaining matrix {2,
7 min read
Construct a square matrix such that the sum of each row and column is odd Given an integer N. Then your task is to output a square matrix of length N using the numbers from the range [1, N2] such that the sum of each row and column is odd. Note: If there are multiple solution, then print any of them. Examples: Input: N = 2 Output: {{1, 2}, {4, 3}} Explanation: Let us calc
11 min read
Count subarrays with same even and odd elements Given an array of N integers, count number of even-odd subarrays. An even - odd subarray is a subarray that contains the same number of even as well as odd integers. Examples : Input : arr[] = {2, 5, 7, 8} Output : 3 Explanation : There are total 3 even-odd subarrays. 1) {2, 5} 2) {7, 8} 3) {2, 5, 7
15+ min read
Count unique paths is a matrix whose product of elements contains odd number of divisors Given a matrix mat[][] of dimension NxM, the task is to count the number of unique paths from the top-left cell, i.e. mat[0][0], to the bottom-right cell, i.e. mat[N - 1][M - 1] of the given matrix such that product of elements in that path contains an odd number of divisors. Possible moves from any
15+ min read
Count number of ordered pairs with Even and Odd Sums Given an array of n positive numbers, the task is to count number of ordered pairs with even and odd sum. Examples: Input: arr[] = {1, 2, 4} Output: Even sum Pairs = 2, Odd sum Pairs = 4 The ordered pairs are (1, 2), (1, 4), (2, 1), (4, 1), (2, 4), (4, 2) Pairs with Even sum: (2, 4), (4, 2) Pairs wi
6 min read