Maximum subarray sum modulo m

09 Mar, 2022
Given an array of n elements and an integer m. The task is to find the maximum value of the sum of its subarray modulo m i.e find the sum of each subarray mod m and print the maximum value of this modulo operation.Examples:  
Input : arr[] = { 3, 3, 9, 9, 5 }
        m = 7
Output : 6
All sub-arrays and their value:
{ 9 } => 9%7 = 2
{ 3 } => 3%7 = 3
{ 5 } => 5%7 = 5
{ 9, 5 } => 14%7 = 2
{ 9, 9 } => 18%7 = 4
{ 3, 9 } => 12%7 = 5
{ 3, 3 } => 6%7 = 6
{ 3, 9, 9 } => 21%7 = 0
{ 3, 3, 9 } => 15%7 = 1
{ 9, 9, 5 } => 23%7 = 2
{ 3, 3, 9, 9 } => 24%7 = 3
{ 3, 9, 9, 5 } => 26%7 = 5
{ 3, 3, 9, 9, 5 } => 29%7 = 1

Input : arr[] = {10, 7, 18}
        m = 13
Output : 12
The subarray {7, 18} has maximum sub-array
sum modulo 13.
 
Method 1 (Brute Force): Use brute force to find all the subarrays of the given array and find sum of each subarray mod m and keep track of maximum.Method 2 (efficient approach): The idea is to compute prefix sum of array. We find maximum sum ending with every index and finally return overall maximum. To find maximum sum ending  at an index, we need to find the starting point of maximum sum ending with i. Below steps explain how to find the starting point. 
Let prefix sum for index i be prefixi, i.e., 
prefixi = (arr[0] + arr[1] + .... arr[i] ) % m

Let maximum sum ending with i be, maxSumi. 
Let this sum begins with index j.

maxSumi = (prefixi - prefixj + m) % m
                   
From above expression it is clear that the
value of maxSumi becomes maximum when 
prefixj is greater than prefixi 
and closest to prefixi
We mainly have two operations in above algorithm.  
Store all prefixes.For current prefix, prefixi, find the smallest value greater than or equal to prefixi + 1.
Store all prefixes.
For current prefix, prefixi, find the smallest value greater than or equal to prefixi + 1.
For above operations, a self-balancing-binary-search-trees like AVL Tree, Red-Black Tree, etc are best suited. In below implementation we use set in STL which implements a self-balancing-binary-search-tree.Below is the implementation of this approach:  
C++
Java
Python3
C#
Javascript
// C++ program to find sub-array having maximum// sum of elements modulo m.#include<bits/stdc++.h>using namespace std; // Return the maximum sum subarray mod m.int maxSubarray(int arr[], int n, int m){    int x, prefix = 0, maxim = 0;     set<int> S;    S.insert(0);        // Traversing the array.    for (int i = 0; i < n; i++)    {        // Finding prefix sum.        prefix = (prefix + arr[i])%m;         // Finding maximum of prefix sum.        maxim = max(maxim, prefix);         // Finding iterator pointing to the first        // element that is not less than value        // "prefix + 1", i.e., greater than or        // equal to this value.        auto it = S.lower_bound(prefix+1);         if (it != S.end())            maxim = max(maxim, prefix - (*it) + m );         // Inserting prefix in the set.        S.insert(prefix);    }     return maxim;} // Driver Programint main(){    int arr[] = { 3, 3, 9, 9, 5 };    int n = sizeof(arr)/sizeof(arr[0]);    int m = 7;    cout << maxSubarray(arr, n, m) << endl;    return 0;}
// Java program to find sub-array// having maximum sum of elements modulo m.import java.util.*;class GFG{   // Return the maximum sum subarray mod m.  static int maxSubarray(int[] arr, int n, int m)  {    int x = 0;    int prefix = 0;    int maxim = 0;    Set<Integer> S = new HashSet<Integer>();    S.add(0);     // Traversing the array.    for (int i = 0; i < n; i++)    {       // Finding prefix sum.      prefix = (prefix + arr[i]) % m;       // Finding maximum of prefix sum.      maxim = Math.max(maxim, prefix);       // Finding iterator pointing to the first      // element that is not less than value      // "prefix + 1", i.e., greater than or      // equal to this value.      int it = 0;       for (int j : S)      {        if (j >= prefix + 1)          it = j;      }      if (it != 0)      {        maxim = Math.max(maxim, prefix - it + m);      }       // adding prefix in the set.      S.add(prefix);    }    return maxim;  }   // Driver code  public static void main(String[] args)  {     // Driver Code    int[] arr = new int[] { 3, 3, 9, 9, 5 };    int n = 5;    int m = 7;    System.out.print(maxSubarray(arr, n, m));  }} // This code is contributed by pratham76.
# Python3 program to find sub-array# having maximum sum of elements modulo m. # Return the maximum sum subarray mod m.def maxSubarray(arr, n, m):     x = 0    prefix = 0    maxim = 0     S = set()    S.add(0)         # Traversing the array.    for i in range(n):         # Finding prefix sum.        prefix = (prefix + arr[i]) % m         # Finding maximum of prefix sum.        maxim = max(maxim, prefix)         # Finding iterator pointing to the first        # element that is not less than value        # "prefix + 1", i.e., greater than or        # equal to this value.        it = 0        for i in S:            if i >= prefix + 1:                it = i        if (it != 0) :                maxim = max(maxim, prefix - it + m )         # adding prefix in the set.        S.add(prefix)     return maxim # Driver Codearr = [3, 3, 9, 9, 5]n = 5m = 7print(maxSubarray(arr, n, m)) # This code is contributed by# Shubham Singh(SHUBHAMSINGH10)
// C# program to find sub-array// having maximum sum of elements modulo m.using System;using System.Collections;using System.Collections.Generic; class GFG{   // Return the maximum sum subarray mod m.  static int maxSubarray(int[] arr, int n, int m)  {         int prefix = 0;    int maxim = 0;    HashSet<int> S = new HashSet<int>();    S.Add(0);     // Traversing the array.    for (int i = 0; i < n; i++)    {       // Finding prefix sum.      prefix = (prefix + arr[i]) % m;       // Finding maximum of prefix sum.      maxim = Math.Max(maxim, prefix);       // Finding iterator pointing to the first      // element that is not less than value      // "prefix + 1", i.e., greater than or      // equal to this value.      int it = 0;       foreach(int j in S)      {        if (j >= prefix + 1)          it = j;      }      if (it != 0)      {        maxim = Math.Max(maxim, prefix - it + m);      }       // adding prefix in the set.      S.Add(prefix);    }    return maxim;  }   // Driver code  public static void Main(string[] args)  {     int[] arr = new int[] { 3, 3, 9, 9, 5 };    int n = 5;    int m = 7;    Console.Write(maxSubarray(arr, n, m));  }} // This code is contributed by rutvik_56.
<script>// Javascript program to find sub-array// having maximum sum of elements modulo m. // Return the maximum sum subarray mod m.function maxSubarray(arr,n,m){    let x = 0;    let prefix = 0;    let maxim = 0;    let S = new Set();    S.add(0);      // Traversing the array.    for (let i = 0; i < n; i++)    {        // Finding prefix sum.      prefix = (prefix + arr[i]) % m;        // Finding maximum of prefix sum.      maxim = Math.max(maxim, prefix);        // Finding iterator pointing to the first      // element that is not less than value      // "prefix + 1", i.e., greater than or      // equal to this value.      let it = 0;        for (let j of S.values())      {        if (j >= prefix + 1)          it = j;      }      if (it != 0)      {        maxim = Math.max(maxim, prefix - it + m);      }        // adding prefix in the set.      S.add(prefix);    }    return maxim;}  // Driver Codelet arr=[3, 3, 9, 9, 5];let n = 5;let m = 7;document.write(maxSubarray(arr, n, m)); // This code is contributed by avanitrachhadiya2155</script>
Output:  
6
Reference: http://stackoverflow.com/questions/31113993/maximum-subarray-sum-modulo-mThis article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or 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. 
SHUBHAMSINGH10
pratham76
rutvik_56
lecturedsaece
avanitrachhadiya2155
surinderdawra388
Modular Arithmetic
prefix-sum
Self-Balancing-BST
Mathematical
prefix-sum
Mathematical
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.