Number of Subsequences with Even and Odd Sum | Set 2

Given an array arr[] of size N. The task is to find the number of subsequences whose sum is even and the number of subsequences whose sum is odd.

Examples:

Input: arr[] = {1, 2, 2, 3}
Output: EvenSum = 7, OddSum = 8
There are 2N-1 possible subsequences.
The subsequences with even sum are
1) {1, 3} Sum = 4
2) {1, 2, 2, 3} Sum = 8
3) {1, 2, 3} Sum = 6 (Of index 1)
4) {1, 2, 3} Sum = 6 (Of index 2)
5) {2} Sum = 2 (Of index 1)
6) {2, 2} Sum = 4
7) {2} Sum = 2 (Of index 2)
and the rest subsequence is of odd sum.

Input: arr[] = { 2, 2, 2, 2 }
Output: EvenSum = 15, OddSum = 0

Approach: This article already exists here having time complexity of where N is the size of array. Visit here before moving further.



Tseq = 2N – 1 = Even Subsequence + OddSubsequence

Eseq = 2Even

Oseq = OddC1 + OddC3 + OddC5 + . . . .
where OddC1 = Choosing 1 Odd
OddC3 = Choosing 3 Odd and so on

We can reduce the above equation by this identity, Hence

Oseq = 2Odd – 1

So, hence for the total odd sum subsequence, it can be calculated by multiplying these above result

OddSumSeq = 2Even * 2Odd – 1

EvenSumSeq = 2N – 1 – OddSumSeq

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find number of
// Subsequences with Even and Odd Sum
#include <bits/stdc++.h>
using namespace std;
  
// Function to find number of
// Subsequences with Even and Odd Sum
pair<int, int> countSum(int arr[], int n)
{
    int NumberOfOdds = 0, NumberOfEvens = 0;
  
    // Counting number of odds
    for (int i = 0; i < n; i++)
        if (arr[i] & 1)
            NumberOfOdds++;
  
    // Even count
    NumberOfEvens = n - NumberOfOdds;
  
    int NumberOfOddSubsequences = (1 << NumberOfEvens)
                                  * (1 << (NumberOfOdds - 1));
  
    // Total Subsequences is (2^n - 1)
    // For NumberOfEvenSubsequences subtract
    // NumberOfOddSubsequences from total
    int NumberOfEvenSubsequences = (1 << n) - 1
                                   - NumberOfOddSubsequences;
  
    return { NumberOfEvenSubsequences,
             NumberOfOddSubsequences };
}
  
// Driver code
int main()
{
    int arr[] = { 1, 2, 2, 3 };
  
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // Calling the function
    pair<int, int> ans = countSum(arr, n);
  
    cout << "EvenSum = " << ans.first;
    cout << " OddSum = " << ans.second;
  
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find number of
// Subsequences with Even and Odd Sum
import java.util.*;
  
class GFG 
{
static class pair
    int first, second; 
    public pair(int first, int second) 
    
        this.first = first; 
        this.second = second; 
    
}
  
// Function to find number of
// Subsequences with Even and Odd Sum
static pair countSum(int arr[], int n)
{
    int NumberOfOdds = 0, NumberOfEvens = 0;
  
    // Counting number of odds
    for (int i = 0; i < n; i++)
        if (arr[i] % 2 == 1)
            NumberOfOdds++;
  
    // Even count
    NumberOfEvens = n - NumberOfOdds;
  
    int NumberOfOddSubsequences = (1 << NumberOfEvens) * 
                                  (1 << (NumberOfOdds - 1));
  
    // Total Subsequences is (2^n - 1)
    // For NumberOfEvenSubsequences subtract
    // NumberOfOddSubsequences from total
    int NumberOfEvenSubsequences = (1 << n) - 1
                                    NumberOfOddSubsequences;
  
    return new pair(NumberOfEvenSubsequences,
                    NumberOfOddSubsequences);
}
  
// Driver code
public static void main(String[] args) 
{
    int arr[] = { 1, 2, 2, 3 };
  
    int n = arr.length;
  
    // Calling the function
    pair ans = countSum(arr, n);
  
    System.out.print("EvenSum = " + ans.first);
    System.out.print(" OddSum = " + ans.second);
}
  
// This code is contributed by PrinciRaj1992
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find number of 
# Subsequences with Even and Odd Sum 
  
# Function to find number of 
# Subsequences with Even and Odd Sum 
def countSum(arr, n) : 
  
    NumberOfOdds = 0; NumberOfEvens = 0
  
    # Counting number of odds 
    for i in range(n) : 
        if (arr[i] & 1) : 
            NumberOfOdds += 1
  
    # Even count 
    NumberOfEvens = n - NumberOfOdds; 
  
    NumberOfOddSubsequences = (1 << NumberOfEvens) * \
                              (1 << (NumberOfOdds - 1)); 
  
    # Total Subsequences is (2^n - 1) 
    # For NumberOfEvenSubsequences subtract 
    # NumberOfOddSubsequences from total 
    NumberOfEvenSubsequences = (1 << n) - 1 - \
                                NumberOfOddSubsequences; 
  
    return (NumberOfEvenSubsequences, 
            NumberOfOddSubsequences); 
  
# Driver code 
if __name__ == "__main__"
  
    arr = [ 1, 2, 2, 3 ]; 
  
    n = len(arr); 
  
    # Calling the function 
    ans = countSum(arr, n); 
  
    print("EvenSum =", ans[0], end = " "); 
    print("OddSum =", ans[1]); 
  
# This code is contributed by AnkitRai01
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find number of
// Subsequences with Even and Odd Sum
using System;
      
class GFG 
{
public class pair
    public int first, second; 
    public pair(int first, int second) 
    
        this.first = first; 
        this.second = second; 
    
}
  
// Function to find number of
// Subsequences with Even and Odd Sum
static pair countSum(int []arr, int n)
{
    int NumberOfOdds = 0, NumberOfEvens = 0;
  
    // Counting number of odds
    for (int i = 0; i < n; i++)
        if (arr[i] % 2 == 1)
            NumberOfOdds++;
  
    // Even count
    NumberOfEvens = n - NumberOfOdds;
  
    int NumberOfOddSubsequences = (1 << NumberOfEvens) * 
                                  (1 << (NumberOfOdds - 1));
  
    // Total Subsequences is (2^n - 1)
    // For NumberOfEvenSubsequences subtract
    // NumberOfOddSubsequences from total
    int NumberOfEvenSubsequences = (1 << n) - 1 - 
                                    NumberOfOddSubsequences;
  
    return new pair(NumberOfEvenSubsequences,
                    NumberOfOddSubsequences);
}
  
// Driver code
public static void Main(String[] args) 
{
    int []arr = { 1, 2, 2, 3 };
  
    int n = arr.Length;
  
    // Calling the function
    pair ans = countSum(arr, n);
  
    Console.Write("EvenSum = " + ans.first);
    Console.Write(" OddSum = " + ans.second);
}
  
// This code is contributed by 29AjayKumar
chevron_right

Output:
EvenSum = 7 OddSum = 8

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




Recommended Posts:


pawanasipugmailcom

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :