Open In App

Minimum count of groups such that sum of adjacent elements is divisible by K in each group

Given an array arr[] consisting of N integers, and an integer K, the task is to print the minimum count of groups formed by taking elements of the array such that the sum of adjacent elements is divisible by K in each group.

Examples:



Input: arr[] = {2, 6, 5, 8, 2, 9}, K = 2
Output: 2
The array can be split into two groups {2, 6, 2, 8} and {5, 9}.
The sum of adjacent elements of each group is divisible by K.
Thus, the minimum number of groups that can be formed is 2.

Input: arr[] = {1, 1, 4, 4, 8, 6, 7}, K = 8
Output: 4
Explanation:
The array can be split into 4 groups: {1, 7, 1}, {4, 4}, {8}, and {6}.
The sum of adjacent elements of each group is divisible by K.
Thus, the minimum number of groups that can be formed is 4.



Input: arr[] = {144}, K = 5
Output: 1

Approach: The given problem can be solved based on the following observations: 

Follow the steps below to solve the problem:

Below is the implementation of the above approach:




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to count the minimum number
// of groups
int findMinGroups(int arr[], int N, int K)
{
    // Stores the count of elements
    unordered_map<int, int> mp;
 
    // Stores the count of groups
    int ans = 0;
 
    // Traverse the array arr[]
    for (int i = 0; i < N; i++) {
 
        // Update arr[i]
        arr[i] = arr[i] % K;
 
        // If arr[i] is 0
        if (arr[i] == 0) {
 
            // Update ans
            ans = 1;
        }
        else {
 
            // Increment mp[arr[i]] by 1
            mp[arr[i]]++;
        }
    }
 
    // Iterarte over the range [1, K / 2]
    for (int i = 1; i <= K / 2; i++) {
 
        // Stores the minimum of count of i
        // and K - i
        int c1 = min(mp[K - i], mp[i]);
 
        // Stores the maximum of count of i
        // and K - i
        int c2 = max(mp[K - i], mp[i]);
 
        // If c1 is 0
        if (c1 == 0) {
 
            // Increment ans by c2
            ans += c2;
        }
 
        // Otherwise if c2 is equal to c1 + 1
        // or c1
        else if (c2 == c1 + 1 || c1 == c2) {
 
            // Increment ans by 1
            ans++;
        }
        // Otherwise
        else {
 
            // Increment ans by c2 - c1 - 1
            ans += (c2 - c1 - 1);
        }
    }
 
    // Return the ans
    return ans;
}
 
// Driver Code
int main()
{
    // Input
    int arr[] = { 1, 1, 4, 4, 8, 6, 7 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 8;
 
    // Function Call
    cout << findMinGroups(arr, N, K);
 
    return 0;
}




// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG
{
   
    // Function to count the minimum number
    // of groups
    public static int findMinGroups(int arr[], int N, int K)
    {
        // Stores the count of elements
        HashMap<Integer, Integer> mp = new HashMap<>();
         
        // Stores the count of groups
        int ans = 0;
     
        // Traverse the array arr[]
        for (int i = 0; i < N; i++) {
     
            // Update arr[i]
            arr[i] = arr[i] % K;
     
            // If arr[i] is 0
            if (arr[i] == 0) {
     
                // Update ans
                ans = 1;
            }
            else {
     
                // Increment mp[arr[i]] by 1
                if (!mp.containsKey(arr[i])) {
                    mp.put(arr[i], 1);
                }
                else {
                    Integer ct = mp.get(arr[i]);
                    if(ct!=null)
                    {
                        ct++;
                        mp.put(arr[i], ct);
                    }
                }
            }
        }
     
        // Iterarte over the range [1, K / 2]
        for (int i = 1; i <= K / 2; i++) {
     
            // Stores the minimum of count of i
            // and K - i
            int a=0,b=0;
            if(mp.containsKey(K-i)){
                a=mp.get(K-i);
            }
            if(mp.containsKey(i)){
                b=mp.get(i);
            }
            int c1 = Math.min(a, b);
     
            // Stores the maximum of count of i
            // and K - i
            int c2 = Math.max(a, b);
     
            // If c1 is 0
            if (c1 == 0) {
     
                // Increment ans by c2
                ans += c2;
            }
     
            // Otherwise if c2 is equal to c1 + 1
            // or c1
            else if (c2 == c1 + 1 || c1 == c2) {
     
                // Increment ans by 1
                ans++;
            }
            // Otherwise
            else {
     
                // Increment ans by c2 - c1 - 1
                ans += (c2 - c1 - 1);
            }
        }
     
        // Return the ans
        return ans;
    }
    public static void main (String[] args) {
        // Input
        int arr[] = { 1, 1, 4, 4, 8, 6, 7 };
        int N = 7;
        int K = 8;
         
        // Function Call
        System.out.println(findMinGroups(arr, N, K));
    }
}
 
// This code is contributed by Manu Pathria




# Python3 program for the above approach
 
# Function to count the minimum number
# of groups
def findMinGroups(arr, N, K):
     
    # Stores the count of elements
    mp = {}
 
    # Stores the count of groups
    ans = 0
 
    # Traverse the array arr[]
    for i in range(N):
         
        # Update arr[i]
        arr[i] = arr[i] % K
 
        # If arr[i] is 0
        if (arr[i] == 0):
             
            # Update ans
            ans = 1
        else:
            mp[arr[i]] = mp.get(arr[i], 0) + 1
 
    # Iterarte over the range [1, K / 2]
    for i in range(1, K // 2):
         
        # Stores the minimum of count of i
        # and K - i
        x, y = (0 if (K - i) not in mp else mp[K - i],
                      0 if i not in mp else mp[K - i])
        c1 = min(x, y)
 
        # The maximum of count of i
        # K - i
        c2 = max(x, y)
 
        # If c1 is 0
        if (c1 == 0):
             
            # Increment ans by c2
            ans += c2
             
        # Otherwise if c2 is equal to c1 + 1
        # or c1
        elif (c2 == c1 + 1 or c1 == c2):
             
            # Increment ans by 1
            ans += 1
             
        # Otherwise   
        else:
 
            # Increment ans by c2 - c1 - 1
            ans += (c2 - c1 - 1)
             
    # Return the ans
    return ans + 1
 
# Driver code
if __name__ == '__main__':
     
    # Input
    arr = [ 1, 1, 4, 4, 8, 6, 7 ]
    N = len(arr)
    K = 8
 
    # Function Call
    print(findMinGroups(arr, N, K))
 
# This code is contributed by mohit kumar 29




// C# program for the above approach
using System;
using System.Collections.Generic;
 
public class GFG{
 
    // Function to count the minimum number
    // of groups
     static int findMinGroups(int[] arr, int N, int K)
    {
        // Stores the count of elements
        Dictionary<int, int> mp = new Dictionary<int, int>();
         
        // Stores the count of groups
        int ans = 0;
     
        // Traverse the array arr[]
        for (int i = 0; i < N; i++) {
     
            // Update arr[i]
            arr[i] = arr[i] % K;
     
            // If arr[i] is 0
            if (arr[i] == 0) {
     
                // Update ans
                ans = 1;
            }
            else {
     
                // Increment mp[arr[i]] by 1
                if (!mp.ContainsKey(arr[i])) {
                    mp.Add(arr[i], 1);
                }
                else {
                    int ct = mp[arr[i]];
                    if(ct!=0)
                    {
                        ct++;
                        mp[arr[i]]= ct;
                    }
                }
            }
        }
     
        // Iterarte over the range [1, K / 2]
        for (int i = 1; i <= K / 2; i++) {
     
            // Stores the minimum of count of i
            // and K - i
            int a=0,b=0;
            if(mp.ContainsKey(K-i)){
                a=mp[K-i];
            }
            if(mp.ContainsKey(i)){
                b=mp[i];
            }
            int c1 = Math.Min(a, b);
     
            // Stores the maximum of count of i
            // and K - i
            int c2 = Math.Max(a, b);
     
            // If c1 is 0
            if (c1 == 0) {
     
                // Increment ans by c2
                ans += c2;
            }
     
            // Otherwise if c2 is equal to c1 + 1
            // or c1
            else if (c2 == c1 + 1 || c1 == c2) {
     
                // Increment ans by 1
                ans++;
            }
            // Otherwise
            else {
     
                // Increment ans by c2 - c1 - 1
                ans += (c2 - c1 - 1);
            }
        }
     
        // Return the ans
        return ans;
    }
    static public void Main ()
    {
        // InAdd
        int[] arr = { 1, 1, 4, 4, 8, 6, 7 };
        int N = 7;
        int K = 8;
         
        // Function Call
        Console.Write(findMinGroups(arr, N, K));
    }
}
 
// This code is contributed by shubhamsingh10




<script>
       // JavaScript program for the above approach
 
       // Function to count the minimum number
       // of groups
       function findMinGroups(arr, N, K)
       {
        
           // Stores the count of elements
           let mp = new Map();
 
           // Stores the count of groups
           let ans = 0;
 
           // Traverse the array arr[]
           for (let i = 0; i < N; i++) {
 
               // Update arr[i]
               arr[i] = arr[i] % K;
 
               // If arr[i] is 0
               if (arr[i] == 0) {
 
                   // Update ans
                   ans = 1;
               }
               else {
 
                   // Increment mp[arr[i]] by 1
                   if (!mp.has(arr[i])) {
                       mp.set(arr[i], 1);
                   }
                   else {
                       let ct = mp.get(arr[i]);
                       if (ct != null) {
                           ct++;
                           mp.set(arr[i], ct);
                       }
                   }
               }
           }
 
           // Iterarte over the range [1, K / 2]
           for (let i = 1; i <= K / 2; i++) {
 
               // Stores the minimum of count of i
               // and K - i
               let a = 0, b = 0;
               if (mp.has(K - i)) {
                   a = mp.get(K - i);
               }
               if (mp.has(i)) {
                   b = mp.get(i);
               }
               let c1 = Math.min(a, b);
 
               // Stores the maximum of count of i
               // and K - i
               let c2 = Math.max(a, b);
 
               // If c1 is 0
               if (c1 == 0) {
 
                   // Increment ans by c2
                   ans += c2;
               }
 
               // Otherwise if c2 is equal to c1 + 1
               // or c1
               else if (c2 == c1 + 1 || c1 == c2) {
 
                   // Increment ans by 1
                   ans++;
               }
               // Otherwise
               else {
 
                   // Increment ans by c2 - c1 - 1
                   ans += (c2 - c1 - 1);
               }
           }
 
           // Return the ans
           return ans;
       }
 
       // Input
       let arr = [1, 1, 4, 4, 8, 6, 7];
       let N = 7;
       let K = 8;
 
       // Function Call
       document.write(findMinGroups(arr, N, K));
 
   // This code is contributed by Potta Lokesh
 
   </script>

Output
4

Time Complexity: O(N)
Auxiliary Space: O(K)


Article Tags :