Given an array arr[] of size N, consisting of N / 2 even and odd integers each, and an integer K, the task is to find the maximum remainder of sum of a pair of array elements of different parity modulo K.
Examples:
Input: arr[] = {3, 2, 4, 11, 6, 7}, K = 7
Output: 6
Explanation:
Sum of a pair of array elements = 2 + 11
Sum % K = 13 % 7 = 6.
Therefore, the maximum remainder possible is 6.Input: arr[] = {8, 11, 17, 16}, K = 13
Output: 12
Approach: Follow the steps below to solve the problem:
- Initialize a HashSet, say even, to store all even array elements.
- Initialize a TreeSet, say odd, to store all odd array elements.
- Initialize a variable, say max_rem, to store the maximum remainder possible.
- Traverse the HashSet and for each element, find its complement and search for it in the set odd, which is less than equal to its complement.
- Update max_rem with the sum of elements, and it’s complement.
- Print the maximum remainder i.e. value of max_rem.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to find the maximum // remainder of sum of a pair // of array elements modulo K void maxRemainder( int A[], int N, int K)
{ // Stores all even numbers
unordered_set< int > even;
// Stores all odd numbers
set< int > odd;
// Segregate remainders of even
// and odd numbers in respective sets
for ( int i = 0; i < N; i++)
{
int num = A[i];
if (num % 2 == 0)
even.insert(num % K);
else
odd.insert(num % K);
}
// Stores the maximum
// remainder obtained
int max_rem = 0;
// Find the complement of remainder
// of each even number in odd set
for ( int x : even)
{
// Find the complement
// of remainder x
int y = K - 1 - x;
auto it = odd.upper_bound(y);
if (it != odd.begin())
{
it--;
max_rem = max(max_rem, x + *it);
}
}
// Print the answer
cout << max_rem;
} // Driver code int main()
{ // Given array
int arr[] = { 3, 2, 4, 11, 6, 7 };
// Size of the array
int N = sizeof (arr) / sizeof (arr[0]);
// Given value of K
int K = 7;
maxRemainder(arr, N, K);
return 0;
} // This code is contributed by Kingash |
// Java program for the above approach import java.util.*;
class GFG {
// Function to find the maximum
// remainder of sum of a pair
// of array elements modulo K
static void maxRemainder( int A[],
int N, int K)
{
// Stores all even numbers
HashSet<Integer> even
= new HashSet<>();
// Stores all odd numbers
TreeSet<Integer> odd
= new TreeSet<>();
// Segregate remainders of even
// and odd numbers in respective sets
for ( int num : A) {
if (num % 2 == 0 )
even.add(num % K);
else
odd.add(num % K);
}
// Stores the maximum
// remainder obtained
int max_rem = 0 ;
// Find the complement of remainder
// of each even number in odd set
for ( int x : even) {
// Find the complement
// of remainder x
int y = K - 1 - x;
if (odd.floor(y) != null )
max_rem
= Math.max(
max_rem,
x + odd.floor(y));
}
// Print the answer
System.out.print(max_rem);
}
// Driver Code
public static void main(String[] args)
{
// Given array
int arr[] = { 3 , 2 , 4 , 11 , 6 , 7 };
// Size of the array
int N = arr.length;
// Given value of K
int K = 7 ;
maxRemainder(arr, N, K);
}
} |
# Python3 program for the above approach from bisect import bisect_left
# Function to find the maximum # remainder of sum of a pair # of array elements modulo K def maxRemainder(A, N, K):
# Stores all even numbers
even = {}
# Stores all odd numbers
odd = {}
# Segregate remainders of even
# and odd numbers in respective sets
for i in range (N):
num = A[i]
if (num % 2 = = 0 ):
even[num % K] = 1
else :
odd[num % K] = 1
# Stores the maximum
# remainder obtained
max_rem = 0
# Find the complement of remainder
# of each even number in odd set
for x in even:
# Find the complement
# of remainder x
y = K - 1 - x
od = list (odd.keys())
it = bisect_left(od, y)
if (it ! = 0 ):
max_rem = max (max_rem, x + od[it])
# Print the answer
print (max_rem)
# Driver code if __name__ = = '__main__' :
# Given array
arr = [ 3 , 2 , 4 , 11 , 6 , 7 ]
# Size of the array
N = len (arr)
# Given value of K
K = 7
maxRemainder(arr, N, K)
# This code is contributed by mohit kumar 29 |
using System;
using System.Collections.Generic;
class GFG
{ // Function to find the maximum
// remainder of sum of a pair
// of array elements modulo K
static void MaxRemainder( int [] A, int N, int K)
{
// Stores all even numbers
HashSet< int > even = new HashSet< int >();
// Stores all odd numbers
SortedSet< int > odd = new SortedSet< int >();
// Segregate remainders of even
// and odd numbers in respective sets
foreach ( int num in A)
{
if (num % 2 == 0)
even.Add(num % K);
else
odd.Add(num % K);
}
// Stores the maximum
// remainder obtained
int max_rem = 0;
// Find the complement of remainder
// of each even number in odd set
foreach ( int x in even)
{
// Find the complement
// of remainder x
int y = K - 1 - x;
if (odd.Min <= y)
max_rem = Math.Max(max_rem, x + ( int )odd.GetViewBetween( int .MinValue, y).Max);
}
// Print the answer
Console.Write(max_rem);
}
// Driver Code
public static void Main( string [] args)
{
// Given array
int [] arr = { 3, 2, 4, 11, 6, 7 };
// Size of the array
int N = arr.Length;
// Given value of K
int K = 7;
MaxRemainder(arr, N, K);
}
} // This code is contributed by phasing17 |
// JavaScript program for the above approach // Function to find the upper bound of an array. function upper_bound(arr, X)
{ let mid;
// Initialise starting index and
// ending index
let low = 0;
let high = arr.length;
// Till low is less than high
while (low < high) {
// Find the middle index
mid = low + Math.floor((high - low) / 2);
// If X is greater than or equal
// to arr[mid] then find
// in right subarray
if (X >= arr[mid]) {
low = mid + 1;
}
// If X is less than arr[mid]
// then find in left subarray
else {
high = mid;
}
}
// if X is greater than arr[n-1]
if (low < N && arr[low] <= X) {
low++;
}
// Return the upper_bound index
return low;
} // Function to find the maximum // remainder of sum of a pair // of array elements modulo K function maxRemainder(A, N, K)
{ // Stores all even numbers
let even = new Array();
// Stores all odd numbers
let odd = new Array();
// Segregate remainders of even
// and odd numbers in respective sets
for (let i = 0; i < N; i++)
{
let num = A[i];
if (num % 2 == 0 && !even.includes(num%K)){
even.push(num % K);
}
else if (num%2 != 0 && !odd.includes(num%K)){
odd.push(num % K);
}
}
odd.sort();
// Stores the maximum
// remainder obtained
let max_rem = 0;
// Find the complement of remainder
// of each even number in odd set
for (let i = 0;i < even.length; i++){
let x = even[i];
// Find the complement
// of remainder xd
// console.log(x);
let y = K - 1 - x;
let it = upper_bound(odd, y);
if (it != 0)
{
it--;
max_rem = Math.max(max_rem, x + odd[it]);
}
}
// Print the answer
console.log(max_rem);
} // Driver code // Given array let arr = [3, 2, 4, 11, 6, 7]; // Size of the array let N = arr.length; // Given value of K let K = 7; maxRemainder(arr, N, K); // This code is contributed by Nidhi goel |
6
Time Complexity: O(N * logN)
Auxiliary Space: O(N)