Open In App

Finding ‘k’ such that its modulus with each array element is same

Last Updated : 12 Dec, 2024
Summarize
Comments
Improve
Suggest changes
Like Article
Like
Share
Report
News Follow

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 

  1. Find out the absolute difference ‘d’ between maximum and minimum element of the array
  2. Find out all the divisors of ‘d’
  3. Step 3: For each divisor check if arr[i]%divisor(d) is same or not .if it is same print it.

Implementation:

C++
// 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 Python3 C# JavaScript PHP

Output
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).

 



Article Tags :
Practice Tags :

Similar Reads

three90RightbarBannerImg