Find number of subarrays with even sum - GeeksforGeeks

10 Feb, 2022
Given an array, find the number of subarrays whose sum is even.
Example : 
Input : arr[] = {1, 2, 2, 3, 4, 1} 
Output : 9

There are possible subarrays with even
sum. The subarrays are 
1) {1, 2, 2, 3}  Sum = 8
2) {1, 2, 2, 3, 4}  Sum = 12
3) {2}  Sum = 2 (At index 1)
4) {2, 2}  Sum = 4
5) {2, 2, 3, 4, 1}  Sum = 12
6) {2}  Sum = 2 (At index 2)
7) {2, 3, 4, 1} Sum = 10
8) {3, 4, 1}  Sum = 8
9) {4}  Sum = 4 
O(n2) time and O(1) space method [Brute Force] We can simply generate all the possible sub-arrays and find whether the sum of all the elements in them is an even or not. If it is even then we will count that sub-array otherwise neglect it. 
C++
Java
Python3
C#
PHP
Javascript
/* C++ program to count number of sub-arrays  whose sum is even using brute force Time Complexity - O(N^2) Space Complexity - O(1) */#include<iostream>using namespace std; int countEvenSum(int arr[], int n){    int result = 0;     // Find sum of all subarrays and increment    // result if sum is even    for (int i=0; i<=n-1; i++)    {        int sum = 0;        for (int j=i; j<=n-1; j++)        {            sum = sum + arr[j];            if (sum % 2 == 0)                    result++;        }    }     return (result);} // Driver codeint main(){    int arr[] = {1, 2, 2, 3, 4, 1};    int n = sizeof (arr) / sizeof (arr[0]);     cout << "The Number of Subarrays with even"            " sum is " << countEvenSum (arr, n);     return (0);}
// Java program to count number// of sub-arrays whose sum is// even using brute force// Time Complexity - O(N^2)// Space Complexity - O(1)import java.io.*; class GFG{static int countEvenSum(int arr[],                        int n){    int result = 0;     // Find sum of all subarrays    // and increment result if    // sum is even    for (int i = 0; i <= n - 1; i++)    {        int sum = 0;        for (int j = i; j <= n - 1; j++)        {            sum = sum + arr[j];            if (sum % 2 == 0)                    result++;        }    }     return (result);} // Driver codepublic static void main (String[] args){int arr[] = {1, 2, 2,             3, 4, 1};int n = arr.length; System.out.print("The Number of Subarrays"+                     " with even sum is ");                      System.out.println(countEvenSum(arr, n));}} // This code is contributed by ajit
# Python 3 program to count number# of sub-arrays whose sum is even# using brute force# Time Complexity - O(N^2)# Space Complexity - O(1) def countEvenSum(arr, n):    result = 0     # Find sum of all subarrays and    # increment result if sum is even    for i in range(0, n, 1):        sum = 0        for j in range(i, n, 1):            sum = sum + arr[j]            if (sum % 2 == 0):                    result = result + 1     return (result) # Driver codeif __name__ == '__main__':    arr = [1, 2, 2, 3, 4, 1]    n = len(arr)    print("The Number of Subarrays" ,                  "with even sum is",               countEvenSum (arr, n)) # This code is contributed by# Surendra_Gangwar
// C# program to count number// of sub-arrays whose sum is// even using brute force// Time Complexity - O(N^2)// Space Complexity - O(1)using System; class GFG{static int countEvenSum(int []arr,                        int n){    int result = 0;     // Find sum of all subarrays    // and increment result if    // sum is even    for (int i = 0; i <= n - 1; i++)    {        int sum = 0;        for (int j = i; j <= n - 1; j++)        {            sum = sum + arr[j];            if (sum % 2 == 0)                    result++;        }    }     return (result);} // Driver codestatic public void Main (){    int []arr = {1, 2, 2,                 3, 4, 1};    int n = arr.Length;     Console.Write("The Number of Subarrays"+                      " with even sum is ");                         Console.WriteLine(countEvenSum(arr, n));    }} // This code is contributed by m_kit
<?php// PHP program to count number// of sub-arrays whose sum is// even using brute force// Time Complexity - O(N^2)// Space Complexity - O(1)function countEvenSum($arr, $n){    $result = 0;     // Find sum of all subarrays    // and increment result if    // sum is even    for ($i = 0; $i <= $n - 1; $i++)    {        $sum = 0;        for ($j = $i; $j <= $n - 1; $j++)        {            $sum = $sum + $arr[$j];            if ($sum % 2 == 0)                    $result++;        }    }     return ($result);} // Driver code$arr = array(1, 2, 2, 3, 4, 1);$n = sizeof ($arr); echo "The Number of Subarrays ",           "with even sum is " ,        countEvenSum ($arr, $n); // This code is contributed by ajit?>
<script> // Javascript program to count number// of sub-arrays whose sum is// even using brute force// Time Complexity - O(N^2)// Space Complexity - O(1) function countEvenSum(arr,                        n){    let result = 0;      // Find sum of all subarrays    // and increment result if    // sum is even    for (let i = 0; i <= n - 1; i++)    {        let sum = 0;        for (let j = i; j <= n - 1; j++)        {            sum = sum + arr[j];            if (sum % 2 == 0)                    result++;        }    }      return (result);} // Driver Code let arr = [1, 2, 2,             3, 4, 1];let n = arr.length;  document.write("The Number of Subarrays"+                     " with even sum is ");                       document.write(countEvenSum(arr, n)); </script>
The Number of Subarrays with even sum is 9
  O(n) Time and O(1) Space Method [Efficient] If we do compute the cumulative sum array in temp[] of our input array, then we can see that the sub-array starting from i and ending at j, has an even sum if temp[] if (temp[j] – temp[i]) % 2 = 0. So, instead of building a cumulative sum array we build a cumulative sum modulo 2 array, and find how many times 0 and 1 appears in temp[] array using handshake formula. [n * (n-1) /2]
C++
Java
Python 3
C#
PHP
Javascript
/* C++ program to count number of sub-arrayswith even sum using an efficient algorithmTime Complexity - O(N)Space Complexity - O(1)*/#include<iostream>using namespace std; int countEvenSum(int arr[], int n){    // A temporary array of size 2. temp[0] is    // going to store count of even subarrays    // and temp[1] count of odd.    // temp[0] is initialized as 1 because there    // a single even element is also counted as    // a subarray    int temp[2] = {1, 0};     // Initialize count.  sum is sum of elements    // under modulo 2 and ending with arr[i].    int result = 0, sum = 0;     // i'th iteration computes sum of arr[0..i]    // under modulo 2 and increments even/odd count    // according to sum's value    for (int i=0; i<=n-1; i++)    {        // 2 is added to handle negative numbers        sum = ( (sum + arr[i]) % 2 + 2) % 2;         // Increment even/odd count        temp[sum]++;    }     // Use handshake lemma to count even subarrays    // (Note that an even can be formed by two even    // or two odd)    result = result + (temp[0]*(temp[0]-1)/2);    result = result + (temp[1]*(temp[1]-1)/2);     return (result);} // Driver codeint main(){    int arr[] = {1, 2, 2, 3, 4, 1};    int n = sizeof (arr) / sizeof (arr[0]);     cout << "The Number of Subarrays with even"            " sum is " << countEvenSum (arr, n);     return (0);}
// Java program to count// number of sub-arrays// with even sum using an// efficient algorithm// Time Complexity - O(N)// Space Complexity - O(1)import java.io.*; class GFG{static int countEvenSum(int arr[],                         int n){    // A temporary array of size 2.    // temp[0] is going to store    // count of even subarrays    // and temp[1] count of odd.    // temp[0] is initialized as    // 1 because there a single even    // element is also counted as    // a subarray    int temp[] = {1, 0};     // Initialize count. sum is    // sum of elements under modulo    // 2 and ending with arr[i].    int result = 0, sum = 0;     // i'th iteration computes sum    // of arr[0..i] under modulo 2    // and increments even/odd count    // according to sum's value    for (int i = 0; i <= n - 1; i++)    {        // 2 is added to handle        // negative numbers        sum = ((sum + arr[i]) %                    2 + 2) % 2;         // Increment even/odd count        temp[sum]++;    }     // Use handshake lemma to    // count even subarrays    // (Note that an even can    // be formed by two even    // or two odd)    result = result + (temp[0] *                      (temp[0] - 1) / 2);    result = result + (temp[1] *                      (temp[1] - 1) / 2);     return (result);} // Driver codepublic static void main (String[] args){ int arr[] = {1, 2, 2, 3, 4, 1};int n = arr.length; System.out.println("The Number of Subarrays"+                       " with even sum is " +                      countEvenSum (arr, n));}} // This code is contributed by ajit
# Python 3 program to count number of sub-arrays# with even sum using an efficient algorithm# Time Complexity - O(N)# Space Complexity - O(1)def countEvenSum(arr, n):     # A temporary array of size 2. temp[0] is    # going to store count of even subarrays    # and temp[1] count of odd.    # temp[0] is initialized as 1 because there    # a single even element is also counted as    # a subarray    temp = [1, 0]     # Initialize count. sum is sum of elements    # under modulo 2 and ending with arr[i].    result = 0    sum = 0     # i'th iteration computes sum of arr[0..i]    # under modulo 2 and increments even/odd    # count according to sum's value    for i in range( n):                 # 2 is added to handle negative numbers        sum = ( (sum + arr[i]) % 2 + 2) % 2         # Increment even/odd count        temp[sum]+= 1     # Use handshake lemma to count even subarrays    # (Note that an even can be formed by two even    # or two odd)    result = result + (temp[0] * (temp[0] - 1) // 2)    result = result + (temp[1] * (temp[1] - 1) // 2)     return (result) # Driver codeif __name__ == "__main__":         arr = [1, 2, 2, 3, 4, 1]    n = len(arr)    print( "The Number of Subarrays with even"            " sum is" , countEvenSum (arr, n)) # This code is contributed by ita_c
// C# program to count// number of sub-arrays// with even sum using an// efficient algorithm// Time Complexity - O(N)// Space Complexity - O(1)using System; class GFG{static int countEvenSum(int []arr,                        int n){    // A temporary array of size 2.    // temp[0] is going to store    // count of even subarrays    // and temp[1] count of odd.    // temp[0] is initialized as    // 1 because there a single even    // element is also counted as    // a subarray    int []temp = {1, 0};     // Initialize count. sum is    // sum of elements under modulo    // 2 and ending with arr[i].    int result = 0, sum = 0;     // i'th iteration computes sum    // of arr[0..i] under modulo 2    // and increments even/odd count    // according to sum's value    for (int i = 0; i <= n - 1; i++)    {        // 2 is added to handle        // negative numbers        sum = ((sum + arr[i]) %                    2 + 2) % 2;         // Increment even        // or odd count        temp[sum]++;    }     // Use handshake lemma to    // count even subarrays    // (Note that an even can    // be formed by two even    // or two odd)    result = result + (temp[0] *                      (temp[0] - 1) / 2);    result = result + (temp[1] *                      (temp[1] - 1) / 2);     return (result);} // Driver codestatic public void Main (){    int []arr = {1, 2, 2, 3, 4, 1};    int n = arr.Length;     Console.WriteLine("The Number of Subarrays"+                          " with even sum is " +                         countEvenSum (arr, n));}} // This code is contributed// by akt_mit
<?php// PHP program to count number// of sub-arrays with even sum// using an efficient algorithm// Time Complexity - O(N)// Space Complexity - O(1)*/function countEvenSum($arr, $n){    // A temporary array of size 2.    // temp[0] is going to store    // count of even subarrays and    // temp[1] count of odd. temp[0]    // is initialized as 1 because    // there a single even element    // is also counted as a subarray    $temp = array(1, 0);     // Initialize count. sum is    // sum of elements under    // modulo 2 and ending with arr[i].    $result = 0; $sum = 0;     // i'th iteration computes    // sum of arr[0..i] under    // modulo 2 and increments    // even/odd count according    // to sum's value    for ($i = 0; $i <= $n - 1; $i++)    {        // 2 is added to handle        // negative numbers        $sum = (($sum + $arr[$i]) %                        2 + 2) % 2;         // Increment even/odd        // count        $temp[$sum]++;    }     // Use handshake lemma to    // count even subarrays    // (Note that an even can    // be formed by two even    // or two odd)    $result = $result + (int)($temp[0] *                             ($temp[0] - 1) / 2);    $result = $result + (int)($temp[1] *                             ($temp[1] - 1) / 2);     return ($result);} // Driver code$arr = array (1, 2, 2,              3, 4, 1);$n = sizeof ($arr); echo "The Number of Subarrays " .        "with even", " sum is " ,         countEvenSum ($arr, $n); // This code is contributed by ajit?>
<script>// Javascript program to count// number of sub-arrays// with even sum using an// efficient algorithm// Time Complexity - O(N)// Space Complexity - O(1)    function countEvenSum(arr,n)    {             // A temporary array of size 2.        // temp[0] is going to store        // count of even subarrays        // and temp[1] count of odd.        // temp[0] is initialized as        // 1 because there a single even        // element is also counted as        // a subarray        let temp = [1, 0];              // Initialize count. sum is        // sum of elements under modulo        // 2 and ending with arr[i].        let result = 0, sum = 0;              // i'th iteration computes sum        // of arr[0..i] under modulo 2        // and increments even/odd count        // according to sum's value        for (let i = 0; i <= n - 1; i++)        {                     // 2 is added to handle            // negative numbers            sum = ((sum + arr[i]) %                        2 + 2) % 2;                  // Increment even/odd count            temp[sum]++;        }              // Use handshake lemma to        // count even subarrays        // (Note that an even can        // be formed by two even        // or two odd)        result = result + (temp[0] *                          (temp[0] - 1) / 2);        result = result + (temp[1] *                          (temp[1] - 1) / 2);              return (result);    }         // Driver code    let arr=[1, 2, 2, 3, 4, 1];    let n = arr.length;    document.write("The Number of Subarrays"+                       " with even sum is " +                      countEvenSum (arr, n));         // This code is contributed by rag2127</script>
Output : 
The Number of Subarrays with even sum is 9
O(n) Time and O(1) Space Method (bottom-up-approach)
If we start counting from last index and keep track of number of subarrays with even sum so far starting from present index then we can calculate number of subarrays with even sum starting from previous index
C++
Java
Python3
C#
Javascript
/* C++ program to count number of sub-arrayswith even sum using an efficient algorithmTime Complexity - O(N)Space Complexity - O(1)*/#include <iostream>using namespace std; long long countEvenSum(int a[], int n){    // Result may be large enough not to    // fit in int;    long long res = 0;       // To keep track of subarrays with even sum    // starting from index i;    int s = 0;    for (int i = n - 1; i >= 0; i--)    {        if (a[i] % 2 == 1)        {            /* s is the count of subarrays starting from             * index i+1 whose sum was even*/            /*            If a[i] is odd then all subarrays starting from            index i+1 which was odd becomes even when a[i]            gets added to it.            */            s = n - i - 1 - s;        }        else        {            /*            If a[i] is even then all subarrays starting from            index i+1 which was even remains even and one            extra a[i] even subarray gets added to it.            */            s = s + 1;        }        res = res + s;    }    return res;} // Driver Codeint main(){     int arr[] = { 1, 2, 2, 3, 4, 1 };    int n = sizeof(arr) / sizeof(arr[0]);     cout << "The Number of Subarrays with even"            " sum is "         << countEvenSum(arr, n);    return 0;} // This code is contributed by Aditya Anand
// Java program to count// number of sub-arrays// with even sum using an// efficient algorithm// Time Complexity - O(N)// Space Complexity - O(1)import java.io.*; class GFG {     public static long countEvenSum(int a[], int n)    {        // result may be large enough not to        // fit in int;        long res = 0;                 // to keep track of subarrays with even        // sum starting from index i        int s = 0;        for (int i = n - 1; i >= 0; i--)        {            if (a[i] % 2 == 1)            {                // s is the count of subarrays starting from                // index i+1 whose sum was even                /*if a[i] is odd then all subarrays starting                from index i+1 which was odd becomeseven                when a[i] gets added to it.*/                s = n - i - 1 - s;            }            else            {                /*if a[i] is even then all subarrays        starting from index i+1 which was even remainseven        and one extra a[i] even subarray gets added to it.*/                s = s + 1;            }            res = res + s;        }        return res;    }         // Driver Code    public static void main(String[] args)    {        int arr[] = { 1, 2, 2, 3, 4, 1 };        int n = arr.length;         System.out.println("The Number of Subarrays"                           + " with even sum is "                           + countEvenSum(arr, n));    }} // This code is contributed by Aditya Anand
# Python 3 program to count number of sub-arrays# with even sum using an efficient algorithm# Time Complexity - O(N)# Space Complexity - O(1)  def countEvenSum(arr, n):       # result may be large    # enough not to fit in int;    res = 0         # to keep track of subarrays    # with even sum starting from index i    s = 0     for i in reversed(range(n)):        if arr[i] % 2 == 1:            # s is the count of subarrays            # starting from index i+1            # whose sum was even            """            if a[i] is odd then all subarrays            starting from index i+1 which was            odd becomes even when a[i] gets            added to it.            """            s = n-i-1-s        else:                       """            if a[i] is even then all subarrays            starting from index i+1 which was            even remains even and one extra a[i]            even subarray gets added to it.            """            s = s+1        res = res + s    return res  # Driver codeif __name__ == "__main__":     arr = [1, 2, 2, 3, 4, 1]    n = len(arr)    print("The Number of Subarrays with even"          " sum is", countEvenSum(arr, n)) # This code is contributed by Aditya Anand
// C# program to count// number of sub-arrays// with even sum using an// efficient algorithm// Time Complexity - O(N)// Space Complexity - O(1)using System;public class GFG{  public static long countEvenSum(int[] a, int n)  {     // result may be large enough not to    // fit in int;    long res = 0;     // to keep track of subarrays with even    // sum starting from index i    int s = 0;    for (int i = n - 1; i >= 0; i--)    {      if (a[i] % 2 == 1)      {         // s is the count of subarrays starting from        // index i+1 whose sum was even        /*if a[i] is odd then all subarrays starting                from index i+1 which was odd becomeseven                when a[i] gets added to it.*/        s = n - i - 1 - s;      }      else      {         /*if a[i] is even then all subarrays        starting from index i+1 which was even remainseven        and one extra a[i] even subarray gets added to it.*/        s = s + 1;      }      res = res + s;    }    return res;  }   // Driver Code  static public void Main ()  {    int[] arr = { 1, 2, 2, 3, 4, 1 };    int n = arr.Length;     Console.WriteLine("The Number of Subarrays"                      + " with even sum is "                      + countEvenSum(arr, n));  }} // This code is contributed by avanitrachhadiya2155
<script>     // Javascript program to count    // number of sub-arrays    // with even sum using an    // efficient algorithm    // Time Complexity - O(N)    // Space Complexity - O(1)         function countEvenSum(a, n)    {       // result may be large enough not to      // fit in int;      let res = 0;       // to keep track of subarrays with even      // sum starting from index i      let s = 0;      for (let i = n - 1; i >= 0; i--)      {        if (a[i] % 2 == 1)        {           // s is the count of subarrays starting from          // index i+1 whose sum was even          /*if a[i] is odd then all subarrays starting            from index i+1 which was odd becomeseven            when a[i] gets added to it.*/          s = n - i - 1 - s;        }        else        {           /*if a[i] is even then all subarrays          starting from index i+1 which was even remainseven          and one extra a[i] even subarray gets added to it.*/          s = s + 1;        }        res = res + s;      }      return res;    }           let arr = [ 1, 2, 2, 3, 4, 1 ];    let n = arr.length;      document.write("The Number of Subarrays" +    " with even sum is " + countEvenSum(arr, n));     </script>
The Number of Subarrays with even sum is 9
This article is contributed by Rachit Belwariar. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
jit_t
repejufac
SURENDRA_GANGWAR
ukasp
adityaanand12017
avanitrachhadiya2155
souravghosh0416
rag2127
divyesh072019
sagar0719kumar
Directi
subarray
subarray-sum
Arrays
Mathematical
Directi
Arrays
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Stack Data Structure (Introduction and Program)
Multidimensional Arrays in Java
Queue | Set 1 (Introduction and Array Implementation)
Linear Search
Python | Using 2D arrays/lists the right way
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7
Merge two sorted arrays