Number of subsequences with negative product
Given an array arr[] of N integers, the task is to find the count of all the subsequences of the array that have a negative products.
Examples:
Input: arr[] = {1, -5, -6}
Output: 4
Explanation
{-5}, {-6}, {1, -5} and {1, -6} are the only possible subsequences
Input: arr[] = {2, 3, 1}
Output: 0
Explanation
There is no such possible subsequence with negative product
Naive Approach:
Generate all the subsequences of the array and compute the product of all the subsequences. If the product is negative then increment the count by 1.
Efficient Approach:
- Count the number of positive and negative elements in the array
- An odd number of negative elements can be chosen for the subsequence to maintain the negative product. The number of different combinations of subsequences with an odd number of negative elements will be pow(2, count of negative elements – 1)
- Any number of positive elements can be chosen for the subsequence to maintain the negative product. The number of different combinations of subsequences with all the positive elements will be pow(2, count of positive elements)
C++
#include <bits/stdc++.h>
using namespace std;
int cntSubSeq( int arr[], int n)
{
int pos_count = 0;
int neg_count = 0;
int result;
for ( int i = 0; i < n; i++) {
if (arr[i] > 0)
pos_count++;
if (arr[i] < 0)
neg_count++;
}
result = pow (2, pos_count);
if (neg_count > 0)
result *= pow (2, neg_count - 1);
else
result = 0;
return result;
}
int main()
{
int arr[] = { 3, -4, -1, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << cntSubSeq(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int cntSubSeq( int arr[], int n)
{
int pos_count = 0 ;
int neg_count = 0 ;
int result;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] > 0 )
pos_count++;
if (arr[i] < 0 )
neg_count++;
}
result = ( int ) Math.pow( 2 , pos_count);
if (neg_count > 0 )
result *= Math.pow( 2 , neg_count - 1 );
else
result = 0 ;
return result;
}
public static void main(String[] args)
{
int arr[] = { 3 ,- 4 , - 1 , 6 };
int n = arr.length;
System.out.print(cntSubSeq(arr, n));
}
}
|
Python3
import math
def cntSubSeq(arr, n):
pos_count = 0 ;
neg_count = 0
for i in range (n):
if (arr[i] > 0 ) :
pos_count + = 1
if (arr[i] < 0 ):
neg_count + = 1
result = int (math. pow ( 2 , pos_count))
if (neg_count > 0 ):
result * = int (math. pow ( 2 , neg_count - 1 ))
else :
result = 0
return result
arr = [ 2 , - 3 , - 1 , 4 ]
n = len (arr);
print (cntSubSeq(arr, n))
|
C#
using System;
class GFG
{
static int cntSubSeq( int []arr, int n)
{
int pos_count = 0;
int neg_count = 0;
int result;
for ( int i = 0; i < n; i++)
{
if (arr[i] > 0)
pos_count++;
if (arr[i] < 0)
neg_count++;
}
result = ( int ) Math.Pow(2, pos_count);
if (neg_count > 0)
result *= ( int )Math.Pow(2, neg_count - 1);
else
result = 0 ;
return result;
}
public static void Main(String[] args)
{
int []arr = { 3,-4, -1, 6 };
int n = arr.Length;
Console.Write(cntSubSeq(arr, n));
}
}
|
Javascript
<script>
function cntSubSeq(arr, n)
{
var pos_count = 0;
var neg_count = 0;
var result;
for ( var i = 0; i < n; i++)
{
if (arr[i] > 0)
pos_count++;
if (arr[i] < 0)
neg_count++;
}
result = Math.pow(2, pos_count);
if (neg_count > 0)
result *= Math.pow(2, neg_count - 1);
else
result = 0;
return result;
}
var arr = [ 3, -4, -1, 6 ];
var n = arr.length;
document.write(cntSubSeq(arr, n));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Another Approach:
We can also count the number of subsequences with a negative product by subtracting total number of subsequences with positive subsequences from the total number of subsequences.
To find the total number of subsequences with a positive product using the approach discussed in this article.
Last Updated :
19 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...