# Program to find the maximum sum of the subarray modulo by m in Python

Program to find the maximum sum of the subarray modulo by m in Python

Suppose we have an array nums with n elements. We have another integer m. We have to find the maximum value of sum of any of its subarrays modulo m.

So, if the input is like nums = [1,5,7,3] m = 5, then the output will be 3 because

• [1] mod 5 = 1
• [5] mod 5 = 0
• [7] mod 5 = 2
• [3] mod 5 = 3
• [1,5] mod 5 = 1
• [5,7] mod 5 = 2
• [7,3] mod 5 = 0
• [1,5,7] mod 5 = 3
• [5,7,3] mod 5 = 0
• [1,5,7,3] mod 5 = 1

To solve this, we will follow these steps −

• csum := a list and initially insert nums[0] mod m into it
• for each x in nums except first value, do
• insert (last item of csum + x) mod m at the end of csum
• seen := a list with single element initially that is 0
• max_sum := -1
• for each s in csum, do
• idx := the left most position to insert s into seen so that the list will be sorted
• if idx < size of seen, then
• max_sum := maximum of max_sum and s
• otherwise,
• insert s at the left most index of seen so that array is sorted
• insert s at the left most index of seen so that array is sorted
• return max_sum

## Example

Let us see the following implementation to get better understanding −

import bisect
def solve(nums, m):
csum = [nums[0] % m]
for x in nums[1:]:
csum.append((csum[-1] + x) % m)

seen = [0]
max_sum = -1
for s in csum:
idx = bisect.bisect_left(seen, s)
if idx < len(seen):
max_sum = max(max_sum, s, (s - seen[idx]) % m)
else:
max_sum = max(max_sum, s)
bisect.insort_left(seen, s)

return max_sum

nums = [1,5,7,3]
m = 5
print(solve(nums, m))

## Input

"pptpp", [(1,1),(1,4),(1,1),(0,2)]

## Output

3