Find set of m-elements with difference of any two elements is divisible by k
Given an array of n-positive integers and a positive integer k, find a set of exactly m-elements such that difference of any two element is equal to k.
Examples :
Input : arr[] = {4, 7, 10, 6, 9},
k = 3, m = 3
Output : Yes
4 7 10
Input : arr[] = {4, 7, 10, 6, 9},
k = 12, m = 4
Output : No
Input : arr[] = {4, 7, 10, 6, 9},
k = 3, m = 4
Output : No
Approach : To solve this question, just keep a record of remainders when an element is divided by k. Create a multi dimensional array remainder_set[][] of size k whose index shows remainder and elements of that array will element as per their corresponding remainder when divided by k. For example if arr[i] % k = 3 then arr[i] will be element of remainder_set[3] and so on for all elements. Now, traversing the remainder set, one can easily get a set whose size is greater than or equal to required size m if exist. And for sure difference of any elements of that set will be divisible by k.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void findSet( int arr[], int n, int k, int m) {
vector< int > remainder_set[k];
for ( int i = 0; i < n; i++) {
int rem = arr[i] % k;
remainder_set[rem].push_back(arr[i]);
}
for ( int i = 0; i < k; i++) {
if (remainder_set[i].size() >= m) {
cout << "Yes \n" ;
for ( int j = 0; j < m; j++)
cout << remainder_set[i][j] << " " ;
return ;
}
}
cout << "No" ;
}
int main() {
int arr[] = {5, 8, 9, 12, 13, 7, 11, 15};
int k = 4;
int m = 3;
int n = sizeof (arr) / sizeof (arr[0]);
findSet(arr, n, k, m);
}
|
Java
import java.util.*;
class GFG
{
static void findSet( int arr[], int n,
int k, int m)
{
Vector<Integer> []remainder_set = new Vector[k];
for ( int i = 0 ; i < k; i++)
{
remainder_set[i] = new Vector<Integer>();
}
for ( int i = 0 ; i < n; i++)
{
int rem = arr[i] % k;
remainder_set[rem].add(arr[i]);
}
for ( int i = 0 ; i < k; i++)
{
if (remainder_set[i].size() >= m)
{
System.out.println( "Yes" );
for ( int j = 0 ; j < m; j++)
System.out.print(remainder_set[i].get(j) + " " );
return ;
}
}
System.out.print( "No" );
}
public static void main(String[] args)
{
int arr[] = { 5 , 8 , 9 , 12 , 13 , 7 , 11 , 15 };
int k = 4 ;
int m = 3 ;
int n = arr.length;
findSet(arr, n, k, m);
}
}
|
Python3
def findSet( arr, k, m):
arr_size = len (arr);
remainder_set = [ 0 ] * k;
for i in range (k):
remainder_set[i] = [];
for i in range (arr_size):
rem = arr[i] % k;
remainder_set[rem].append(arr[i]);
for i in range (k):
if ( len (remainder_set[i]) > = m):
print ( "Yes" );
for j in range (m):
print (remainder_set[i][j],end = "");
print ( " " ,end = "");
return ;
print ( "No" );
arr = [ 5 , 8 , 9 , 12 , 13 , 7 , 11 , 15 ];
k = 4 ;
m = 3 ;
findSet(arr, k, m);
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void findSet( int []arr, int n,
int k, int m)
{
List< int >[] remainder_set =
new List< int >[k];
for ( int i = 0; i < k; i++)
remainder_set[i] =
new List< int >();
for ( int i = 0; i < n; i++)
{
int rem = arr[i] % k;
remainder_set[rem].Add(arr[i]);
}
for ( int i = 0; i < k; i++)
{
if (remainder_set[i].Count >= m)
{
Console.Write( "Yes \n" );
for ( int j = 0; j < m; j++)
Console.Write(remainder_set[i][j] +
" " );
return ;
}
}
Console.Write( "No" );
}
static void Main()
{
int []arr = new int []{5, 8, 9, 12,
13, 7, 11, 15};
int k = 4;
int m = 3;
int n = arr.Length;
findSet(arr, n, k, m);
}
}
|
PHP
<?php
function findSet( $arr , $k , $m )
{
$arr_size = sizeof( $arr );
for ( $i = 0; $i < $k ; $i ++)
{
$remainder_set [ $i ] = array ();
}
for ( $i = 0; $i < $arr_size ; $i ++)
{
$rem = $arr [ $i ] % $k ;
array_push ( $remainder_set [ $rem ], $arr [ $i ]);
}
for ( $i = 0; $i < $k ; $i ++)
{
if (sizeof( $remainder_set [ $i ]) >= $m )
{
print ( "Yes\n" );
for ( $j = 0; $j < $m ; $j ++)
{
print ( $remainder_set [ $i ][ $j ]);
print ( " " );
}
return ;
}
}
print ( "No" );
}
$arr = array (5, 8, 9, 12, 13, 7, 11, 15);
$k = 4;
$m = 3;
findset( $arr , $k , $m );
?>
|
Javascript
<script>
function findSet(arr, k, m)
{
let arr_size = arr.length;
let remainder_set = []
for (let i = 0; i < k; i++)
{
remainder_set[i] = new Array();
}
for (let i = 0; i < arr_size; i++)
{
let rem = arr[i] % k;
remainder_set[rem].push(arr[i]);
}
for (let i = 0; i < k; i++)
{
if (remainder_set[i].length >= m)
{
document.write( "Yes<br>" );
for (let j = 0; j < m; j++)
{
document.write(remainder_set[i][j]);
document.write( " " );
}
return ;
}
}
document.write( "No" );
}
let arr = [5, 8, 9, 12, 13, 7, 11, 15];
let k = 4;
let m = 3;
findSet(arr, k, m);
</script>
|
Last Updated :
04 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...