Given an array of n integers .We need to find all ‘k’ such that
arr[0] % k = arr[1] % k = ....... = arr[n-1] % k
Examples:
Input : arr[] = {6, 38, 34} Output : 1 2 4 6%1 = 38%1 = 34%1 = 0 6%2 = 38%2 = 34%2 = 0 6%4 = 38%4 = 34%2 = 2 Input : arr[] = {3, 2} Output : 1
Suppose the array contains only two elements a and b (b>a). So we can write b = a + d where d is a positive integer and ‘k’ be a number such that b%k = a%k.
(a + d)%k = a%k a%k + d%k = a%k d%k = 0
Now what we get from the above calculation is that ‘k’ should be a divisor of difference between the two numbers.
Now what we have to do when we have an array of integers
- Find out the difference ‘d’ between maximum and minimum element of the array
- Find out all the divisors of ‘d’
- Step 3: For each divisor check if arr[i]%divisor(d) is same or not .if it is same print it.
Implementation:
// C++ implementation of finding all k // such that arr[i]%k is same for each i #include<bits/stdc++.h> using namespace std;
// Prints all k such that arr[i]%k is same for all i void printEqualModNumbers ( int arr[], int n)
{ // sort the numbers
sort(arr, arr + n);
// max difference will be the difference between
// first and last element of sorted array
int d = arr[n-1] - arr[0];
// Case when all the array elements are same
if (d==0){
cout<< "Infinite solution" ;
return ;
}
// Find all divisors of d and store in
// a vector v[]
vector < int > v;
for ( int i=1; i*i<=d; i++)
{
if (d%i == 0)
{
v.push_back(i);
if (i != d/i)
v.push_back(d/i);
}
}
// check for each v[i] if its modulus with
// each array element is same or not
for ( int i=0; i<v.size(); i++)
{
int temp = arr[0]%v[i];
// checking for each array element if
// its modulus with k is equal to k or not
int j;
for (j=1; j<n; j++)
if (arr[j] % v[i] != temp)
break ;
// if check is true print v[i]
if (j == n)
cout << v[i] << " " ;
}
} // Driver function int main()
{ int arr[] = {38, 6, 34};
int n = sizeof (arr)/ sizeof (arr[0]);
printEqualModNumbers(arr, n);
return 0;
} |
// Java implementation of finding all k // such that arr[i]%k is same for each i import java.util.Arrays;
import java.util.Vector;
class Test
{ // Prints all k such that arr[i]%k is same for all i
static void printEqualModNumbers ( int arr[], int n)
{
// sort the numbers
Arrays.sort(arr);
// max difference will be the difference between
// first and last element of sorted array
int d = arr[n- 1 ] - arr[ 0 ];
// Case when all the array elements are same
if (d== 0 ){
System.out.println( "Infinite solution" );
return ;
}
// Find all divisors of d and store in
// a vector v[]
Vector<Integer> v = new Vector<>();
for ( int i= 1 ; i*i<=d; i++)
{
if (d%i == 0 )
{
v.add(i);
if (i != d/i)
v.add(d/i);
}
}
// check for each v[i] if its modulus with
// each array element is same or not
for ( int i= 0 ; i<v.size(); i++)
{
int temp = arr[ 0 ]%v.get(i);
// checking for each array element if
// its modulus with k is equal to k or not
int j;
for (j= 1 ; j<n; j++)
if (arr[j] % v.get(i) != temp)
break ;
// if check is true print v[i]
if (j == n)
System.out.print(v.get(i) + " " );
}
}
// Driver method
public static void main(String args[])
{
int arr[] = { 38 , 6 , 34 };
printEqualModNumbers(arr, arr.length);
}
} |
# Python3 implementation of finding all k # such that arr[i]%k is same for each i # Prints all k such that arr[i]%k is # same for all i def printEqualModNumbers(arr, n):
# sort the numbers
arr.sort();
# max difference will be the difference
# between first and last element of
# sorted array
d = arr[n - 1 ] - arr[ 0 ];
/ / Case when all the array elements are same
if (d = = 0 ):
print ( "Infinite solution" )
return
# Find all divisors of d and store
# in a vector v[]
v = [];
i = 1 ;
while (i * i < = d):
if (d % i = = 0 ):
v.append(i);
if (i ! = d / i):
v.append(d / i);
i + = 1 ;
# check for each v[i] if its modulus with
# each array element is same or not
for i in range ( len (v)):
temp = arr[ 0 ] % v[i];
# checking for each array element if
# its modulus with k is equal to k or not
j = 1 ;
while (j < n):
if (arr[j] % v[i] ! = temp):
break ;
j + = 1 ;
# if check is true print v[i]
if (j = = n):
print (v[i], end = " " );
# Driver Code arr = [ 38 , 6 , 34 ];
printEqualModNumbers(arr, len (arr));
# This code is contributed by mits |
// C# implementation of finding all k // such that arr[i]%k is same for each i using System;
using System.Collections;
class Test
{ // Prints all k such that arr[i]%k is same for all i
static void printEqualModNumbers ( int []arr, int n)
{
// sort the numbers
Array.Sort(arr);
// max difference will be the difference between
// first and last element of sorted array
int d = arr[n-1] - arr[0];
// Case when all the array elements are same
if (d==0){
Console.write( "Infinite solution" );
return ;
}
// Find all divisors of d and store in
// a vector v[]
ArrayList v = new ArrayList();
for ( int i=1; i*i<=d; i++)
{
if (d%i == 0)
{
v.Add(i);
if (i != d/i)
v.Add(d/i);
}
}
// check for each v[i] if its modulus with
// each array element is same or not
for ( int i=0; i<v.Count; i++)
{
int temp = arr[0]%( int )v[i];
// checking for each array element if
// its modulus with k is equal to k or not
int j;
for (j=1; j<n; j++)
if (arr[j] % ( int )v[i] != temp)
break ;
// if check is true print v[i]
if (j == n)
Console.Write(v[i] + " " );
}
}
// Driver method
public static void Main()
{
int []arr = {38, 6, 34};
printEqualModNumbers(arr, arr.Length);
}
} // This code is contributed by mits |
<?php // PHP implementation of finding all k // such that arr[i]%k is same for each i // Prints all k such that arr[i]%k is same for all i
function printEqualModNumbers ( $arr , $n )
{
// sort the numbers
sort( $arr );
// max difference will be the difference between
// first and last element of sorted array
$d = $arr [ $n -1] - $arr [0];
// Case when all the array elements are same
if (d==0){
print ( "Infinite solution" );
return ;
}
// Find all divisors of d and store in
// a vector v[]
$v = array ();
for ( $i =1; $i * $i <= $d ; $i ++)
{
if ( $d % $i == 0)
{
array_push ( $v , $i );
if ( $i != $d / $i )
array_push ( $v , $d / $i );
}
}
// check for each v[i] if its modulus with
// each array element is same or not
for ( $i =0; $i < count ( $v ); $i ++)
{
$temp = $arr [0]% $v [ $i ];
// checking for each array element if
// its modulus with k is equal to k or not
$j =1;
for (; $j < $n ; $j ++)
if ( $arr [ $j ] % $v [ $i ] != $temp )
break ;
// if check is true print v[i]
if ( $j == $n )
print ( $v [ $i ]. " " );
}
}
// Driver method
$arr = array (38, 6, 34);
printEqualModNumbers( $arr , count ( $arr ));
// This code is contributed by mits ?> |
<script> // JavaScript implementation of finding all k // such that arr[i]%k is same for each i // Prints all k such that arr[i]%k is same for all i
function printEqualModNumbers (arr, n)
{
// sort the numbers
arr.sort((a, b) => a - b);
// max difference will be the difference between
// first and last element of sorted array
d = arr[n-1] - arr[0];
// Case when all the array elements are same
if (d==0){
document.write( "Infinite solution" );
return ;
}
// Find all divisors of d and store in
// a vector v[]
v = new Array();
for (i=1; i*i<=d; i++)
{
if (d%i == 0)
{
v.push(i);
if (i != d/i)
v.push(d/i);
}
}
// check for each v[i] if its modulus with
// each array element is same or not
for (i=0; i< v.length; i++)
{
temp = arr[0]%v[i];
// checking for each array element if
// its modulus with k is equal to k or not
j=1;
for (; j<n; j++)
if (arr[j] % v[i] != temp)
break ;
// if check is true print v[i]
if (j == n)
document.write(v[i] + " " );
}
}
// Driver method
let arr = new Array(38, 6, 34);
printEqualModNumbers(arr, arr.length);
// This code is contributed by _saurabh_jaiswal </script> |
1 2 4
Time Complexity: O(nlog(n))
Since the given array has to be sorted for the given problem, we use the sorting algorithm which takes O(nlog(n)) time.
Space Complexity: O(n)
We use a vector to store all the divisors of the difference of the first and the last element of the sorted array. This has a space complexity of O(n).