Thursday, July 4, 2024
HomeData ModellingData Structure & AlgorithmCount of ways to generate a Matrix with product of each row...

Count of ways to generate a Matrix with product of each row and column as 1 or -1

Given two integers N and M, the task is to find the numbers of ways to form a matrix of size N * M consisting only of 1 or -1, such that the product of integers in each row and each column is equal to 1 or -1.

Examples:

Input: N = 2, M = 2 
Output:
Explanation: Possible ways to get product of each row and column as 1 are, 
{{1, 1}, {1, 1}} and {{-1, -1}, {-1, -1}} 
Possible ways to get product of each row and column as -1 are, {{1, -1}, {-1, 1}} and {{-1, 1}, {1, -1}} Hence, number of ways = 2 + 2 = 4

Input: N = 3, M = 3 
Output: 32 
Explanation: There are 16 ways to get product as 1 and 16 ways to get product as -1. Hence, number of ways = 16 + 16 = 32

Naive Approach: 
The simplest approach to solve this problem is to generate all possible matrices of size N * M and for each of them, calculate the product of all rows and columns and check if it is 1 or -1. 
Time complexity: O(2N*M
Auxiliary Space: O(M*N)

Efficient Approach: Assume, first N-1 rows and first M-1 columns are filled by 1 or -1. Now, the product of each row up to N-1 rows and each column up to M-1 columns would either be 1 or -1. There are a total 2 (N-1) * (M-1) Ways to form a matrix of size (N-1)*(M-1) filled with 1 or -1. Depending on what is needed as a product of N rows and M columns, the last row and column can be filled accordingly.
Follow the steps to solve the problem:

  • If N + M is even
    Number of possible matrices to get the product as 1 = 2 (N-1) * (M-1) 
    Number of possible matrices to get product as -1 = 2 (N-1) * (M-1)
  • If N + M is odd
    Number of possible matrices to get the product as 1 = 2 (N-1) * (M-1) 
    Number of possible matrices to get the product as -1 = 0

Below is the implementation of the above approach:

C++




// C++ implementation of
// the above approach
 
#include<bits/stdc++.h>
using namespace std;
 
// Function to return the
// number of possible ways
void Solve(int N, int M)
{
 
    int temp = (N - 1) * (M - 1);
    int ans = pow(2, temp);
 
    // Check if product can be -1
    if ((N + M) % 2 != 0)
        cout << ans;
    else
        cout << 2 * ans;
 
    cout << endl;
}
// Driver Code
int main()
{
    int N = 3;
    int M = 3;
 
    Solve(N, M);
    return 0;
}


Java




// Java implementation of the above approach
import java.util.Arrays;
 
class GFG{
     
// Function to return the
// number of possible ways
static void Solve(int N, int M)
{
    int temp = (N - 1) * (M - 1);
    int ans = (int)(Math.pow(2, temp));
 
    // Check if product can be -1
    if ((N + M) % 2 != 0)
        System.out.print(ans);
    else
        System.out.print(2 * ans);
}
 
// Driver code
public static void main (String[] args)
{
    int N = 3;
    int M = 3;
     
    Solve(N, M);
}
}
 
// This code is contributed by Shubham Prakash


Python3




# Python3 program to implement
# the above approach
# Function to return
# possible number of ways
 
 
def Solve(N, M):
    temp = (N - 1) * (M - 1)
    ans = pow(2, temp)
 
    # Check if product can be -1
    if ((N + M) % 2 != 0):
        print(ans)
    else:
        print(2 * ans)
 
        # driver code
if __name__ == '__main__':
    N, M = 3, 3
    Solve(N, M)
 
# This code is contributed by Sri_srajit


C#




// C# implementation of the above approach
using System;
 
class GFG{
     
// Function to return the
// number of possible ways
static void Solve(int N, int M)
{
    int temp = (N - 1) * (M - 1);
    int ans = (int)(Math.Pow(2, temp));
 
    // Check if product can be -1
    if ((N + M) % 2 != 0)
        Console.Write(ans);
    else
        Console.Write(2 * ans);
}
 
// Driver Code
public static void Main(string[] args)
{
    int N = 3;
    int M = 3;
     
    Solve(N, M);
}
}
 
// This code is contributed by rutvik_56


Javascript




<script>
 
// Javascript program implementation
// of the approach
 
// Function to return the
// number of possible ways
function Solve(N, M)
{
    let temp = (N - 1) * (M - 1);
    let ans = (Math.pow(2, temp));
   
    // Check if product can be -1
    if ((N + M) % 2 != 0)
        document.write(ans);
    else
        document.write(2 * ans);
}
 
// Driver Code
     
       let N = 3;
    let M = 3;
       
    Solve(N, M);
          
</script>


C




// C implementation of
// the above approach
 
#include<stdio.h>
#include<math.h>
 
// Function to return the
// number of possible ways
void Solve(int N, int M)
{
 
    int temp = (N - 1) * (M - 1);
    int ans = pow(2, temp);
 
    // Check if product can be -1
    if ((N + M) % 2 != 0)
        printf("%d",ans);
    else
       printf("%d",(2*ans));
 
    printf("\n");
}
// Driver Code
void main()
{
    int N = 3;
    int M = 3;
 
    Solve(N, M);
}


Output: 

32

Time complexity: O(log(N*M)) 
Auxiliary Space: O(1)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Calisto Chipfumbu
Calisto Chipfumbuhttp://cchipfumbu@gmail.com
I have 5 years' worth of experience in the IT industry, primarily focused on Linux and Database administration. In those years, apart from learning significant technical knowledge, I also became comfortable working in a professional team and adapting to my environment, as I switched through 3 roles in that time.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments