Open In App

Number of Subsequences with Even and Odd Sum | Set 2

Improve
Improve
Like Article
Like
Save
Share
Report

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 O(N)    where N is the size of array. Visit here before moving further.
 

  • If we can find the number of odd subsequences then we can easily find the number of even subsequences.
  • The odd subsequences can be formed in two ways: 
    1. By taking odd number odd times.
    2. Taking even number and odd number odd time.
  • Below are some variables and their definition: 
    • N = Total number of element in the array.
    • Even = Total number of evens in the array.
    • Odd = Total number of odd in the array.
    • Tseq = Total number of subsequences.
    • Oseq = Total number of subsequences with only odd number.
    • Eseq = Total number of subsequences with even number.
    • OddSumSeq = Total number of subsequences with odd sum.
    • EvenSumSeq = Total number of subsequences with even sum.


 

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: 
 

C++

// 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;
}

                    

Java

// 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

                    

Python3

# 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

                    

C#

// 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

                    

Javascript

<script>
  
// JavaScript program to find number of
// Subsequences with Even and Odd Sum
  
// Function to find number of
// Subsequences with Even and Odd Sum
function countSum(arr, n) {
    let NumberOfOdds = 0, NumberOfEvens = 0;
  
    // Counting number of odds
    for (let i = 0; i < n; i++)
        if (arr[i] & 1)
            NumberOfOdds++;
  
    // Even count
    NumberOfEvens = n - NumberOfOdds;
  
    let NumberOfOddSubsequences = (1 << NumberOfEvens)
        * (1 << (NumberOfOdds - 1));
  
    // Total Subsequences is (2^n - 1)
    // For NumberOfEvenSubsequences subtract
    // NumberOfOddSubsequences from total
    let NumberOfEvenSubsequences = (1 << n) - 1
        - NumberOfOddSubsequences;
  
    return [NumberOfEvenSubsequences,
        NumberOfOddSubsequences];
}
  
// Driver code
let arr = [1, 2, 2, 3];
  
let n = arr.length;
  
// Calling the function
let ans = countSum(arr, n);
  
document.write("EvenSum = " + ans[0]);
document.write(" OddSum = " + ans[1]);
  
  
// This code is contributed by _saurabh_jaiswal
  
</script>

                    

Output: 
EvenSum = 7 OddSum = 8

 

Time Complexity: O(n)

Auxiliary Space: O(1)



Last Updated : 19 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads