Number of Subsequences with Even and Odd Sum | Set 2

• Last Updated : 29 Mar, 2022

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.

• 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 using namespace std; // Function to find number of// Subsequences with Even and Odd Sumpair 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 codeint main(){    int arr[] = { 1, 2, 2, 3 };     int n = sizeof(arr) / sizeof(arr[0]);     // Calling the function    pair 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 Sumimport 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 Sumstatic 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 codepublic 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 Sumdef 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 codeif __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 Sumusing 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 Sumstatic 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 codepublic 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



Output:

EvenSum = 7 OddSum = 8

Time Complexity: O(n)

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up