Related Articles
Find the maximum range [L,R] whose sum is divisible by M
• Last Updated : 27 Jan, 2020

Given an array arr[] consisting of positive numbers, the task is to find the maximum range [L, R] whose sum is divisible by M. If there is no range present return -1.

Examples:

Input: arr[] = {3, 7, 5, 2, 5, 10}, M = 3
Output: 1 3
Explanation: Sum of numbers from 1 to 3 is 3+7+5 which is 15.

Input :
A[] = {4, 8, 12, 16, 20}
M = 11
Output :
-1

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Naive Approach: A naive approach is that we can iterate through all possible L and R in the array and check if the sum is divisible. If it is, then store the length of the array.

Efficient Approach: The idea here is to use a prefix sum array.

• Initially, the prefix sum of the values is calculated.
• Once the prefix sum is calculated, every value is replaced by the value modulo M.
• The indices where the final value is equal is the range where the sum is perfectly divisible by M.
• The maximum range of the same values is found.

Below is the implementation of the above approach,

 `// C++ implementation of the above approach.``#include ``using` `namespace` `std;`` ` `// Function to find the maximum range``// whose sum is divisible by M.``pair<``int``, ``int``> maxrange(``int` `n,``                        ``int` `a[], ``int` `m)``{``    ``int` `pre[n + 5];``    ``map<``int``, set<``int``> > mpp;``    ``int` `value, l, r, lans = -1,``                     ``rans = -1, ans = 0;`` ` `    ``// Calculate the prefix sum``    ``pre = a;``    ``for` `(``int` `i = 1; i < n; i++) {``        ``pre[i] = a[i] + pre[i - 1];``    ``}`` ` `    ``// Replacing the values with modulo M``    ``// and inserting the indices into the map``    ``for` `(``int` `i = 0; i < n; i++) {``        ``pre[i] = pre[i] % m;``        ``mpp[pre[i]].insert(i);``    ``}`` ` `    ``// Calculate the range [L, R]``    ``for` `(``auto` `it = mpp.begin(); it != mpp.end(); it++) {``        ``if` `(it->first == 0) {``            ``value = *((it->second).rbegin()) + 1;``            ``l = 1;``            ``r = value;``        ``}``        ``else` `{``            ``value = *((it->second).rbegin())``                    ``- *((it->second.begin()));``            ``l = *((it->second.begin())) + 2;``            ``r = *((it->second).rbegin()) + 1;``        ``}``        ``if` `(value > ans && l <= r) {``            ``ans = value;``            ``lans = l;``            ``rans = r;``        ``}``    ``}`` ` `    ``return` `make_pair(lans, rans);``}`` ` `// Driver code``int` `main()``{``    ``int` `A[] = { 3, 7, 5, 2, 5, 10 };``    ``int` `N = ``sizeof``(A) / ``sizeof``(A);``    ``int` `M = 3;``    ``pair<``int``, ``int``> value = maxrange(N, A, M);``    ``if` `(value.first == -1) {``        ``cout << -1 << ``"\n"``;``    ``}``    ``else` `{``        ``cout << value.first << ``" "``             ``<< value.second << ``"\n"``;``    ``}``    ``return` `0;``}`
Output:
```1 3
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up