Open In App

Count all possible values of K less than Y such that GCD(X, Y) = GCD(X+K, Y)

Improve
Improve
Like Article
Like
Save
Share
Report

Given two integers X and Y, the task is to find the number of integers, K, such that gcd(X, Y) is equal to gcd(X+K, Y), where 0 < K <Y.

Examples:

Input: X = 3, Y = 15
Output: 4
Explanation: All possible values of K are {0, 3, 6, 9} for which GCD(X, Y) = GCD(X + K, Y).

Input: X = 2, Y = 12
Output: 2
Explanation: All possible values of K are {0, 8}.

Naive Approach: The simplest approach to solve the problem is to iterate over the range [0, Y – 1]and for each value of i, check if GCD(X + i, Y) is equal to GCD(X, Y) or not.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <iostream>
using namespace std;
 
// Function to calculate
// GCD of two integers
int gcd(int a, int b)
{
    if (b == 0)
        return a;
 
    return gcd(b, a % b);
}
 
// Function to count possible
// values of K
int calculateK(int x, int y)
{
    int count = 0;
    int gcd_xy = gcd(x, y);
    for (int i = 0; i < y; i++) {
 
        // If required condition
        // is satisfied
        if (gcd(x + i, y) == gcd_xy)
 
            // Increase count
            count++;
    }
 
    return count;
}
 
// Driver Code
int main()
{
 
    // Given X and y
    int x = 3, y = 15;
 
    cout << calculateK(x, y) << endl;
}


Java




// Java program for the above approach
import java.util.*;
class GFG
{
       
// Function to calculate
// GCD of two integers
static int gcd(int a, int b)
{
    if (b == 0)
        return a;  
    return gcd(b, a % b);
}
   
// Function to count possible
// values of K
static int calculateK(int x, int y)
{
    int count = 0;
    int gcd_xy = gcd(x, y);
    for (int i = 0; i < y; i++)
    {
   
        // If required condition
        // is satisfied
        if (gcd(x + i, y) == gcd_xy)
   
            // Increase count
            count++;
    }  
    return count;
}
   
// Driver code
public static void main(String[] args)
{
    // Given X and y
    int x = 3, y = 15
    System.out.print(calculateK(x, y));
}
}
 
// This code is contributed by sanjoy_62


Python3




# Python3 program for the above approach
 
# Function to calculate
# GCD of two integers
def gcd(a, b):
     
    if (b == 0):
        return a
 
    return gcd(b, a % b)
 
# Function to count possible
# values of K
def calculateK(x, y):
     
    count = 0
    gcd_xy = gcd(x, y)
 
    for i in range(y):
         
        # If required condition
        # is satisfied
        if (gcd(x + i, y) == gcd_xy):
             
            # Increase count
            count += 1
 
    return count
 
# Driver Code
if __name__ == '__main__':
     
    # Given X and y
    x = 3
    y = 15
 
    print (calculateK(x, y))
 
# This code is contributed by mohit kumar 29


C#




// C# program for the above approach
using System;
 
class GFG{
       
// Function to calculate
// GCD of two integers
static int gcd(int a, int b)
{
    if (b == 0)
        return a; 
         
    return gcd(b, a % b);
}
   
// Function to count possible
// values of K
static int calculateK(int x, int y)
{
    int count = 0;
    int gcd_xy = gcd(x, y);
     
    for(int i = 0; i < y; i++)
    {
         
        // If required condition
        // is satisfied
        if (gcd(x + i, y) == gcd_xy)
         
            // Increase count
            count++;
    }  
    return count;
}
   
// Driver code
public static void Main(String[] args)
{
     
    // Given X and y
    int x = 3, y = 15; 
     
    Console.Write(calculateK(x, y));
}
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
 
// JavaScript program for the above approach
 
    // Function to calculate
    // GCD of two integers
    function gcd(a , b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }
 
    // Function to count possible
    // values of K
    function calculateK(x , y) {
        var count = 0;
        var gcd_xy = gcd(x, y);
        for (i = 0; i < y; i++) {
 
            // If required condition
            // is satisfied
            if (gcd(x + i, y) == gcd_xy)
 
                // Increase count
                count++;
        }
        return count;
    }
 
    // Driver code
     
        // Given X and y
        var x = 3, y = 15;
        document.write(calculateK(x, y));
 
// This code is contributed by todaysgaurav
 
</script>


Output: 

4

 

Time Complexity: O(YlogY)
Auxiliary Space: O(1)

Efficient Approach: The idea is to use the concept of Euler’s totient function. Follow the steps below to solve the problem: 

  • Calculate the gcd of X and Y and store it in a variable g.
  •  Initialize a variable n with Y/g.
  •  Now, find the totient function for n which will be the required answer.

Below is the implementation of the above approach:   

C++




// C++ program for the above approach
 
#include <iostream>
using namespace std;
 
// Function to find the gcd of a and b
int gcd(int a, int b)
{
 
    if (b == 0)
        return a;
 
    return gcd(b, a % b);
}
 
// Function to find the number of Ks
int calculateK(int x, int y)
{
 
    // Find gcd
    int g = gcd(x, y);
    int n = y / g;
    int res = n;
 
    // Calculating value of totient
    // function for n
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            res -= (res / i);
            while (n % i == 0)
                n /= i;
        }
    }
    if (n != 1)
        res -= (res / n);
    return res;
}
 
// Driver Code
int main()
{
 
    // Given X and Y
    int x = 3, y = 15;
 
    cout << calculateK(x, y) << endl;
}


Java




// Java program for the above approach
import java.util.*;
class GFG
{
 
// Function to find the gcd of a and b
static int gcd(int a, int b)
{
 
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
 
// Function to find the number of Ks
static int calculateK(int x, int y)
{
 
    // Find gcd
    int g = gcd(x, y);
    int n = y / g;
    int res = n;
 
    // Calculating value of totient
    // function for n
    for (int i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            res -= (res / i);
            while (n % i == 0)
                n /= i;
        }
    }
    if (n != 1)
        res -= (res / n);
    return res;
}
 
// Driver Code
public static void main(String[] args)
{
 
    // Given X and Y
    int x = 3, y = 15;
    System.out.print(calculateK(x, y) +"\n");
}
}
 
// This code is contributed by shikhasingrajput


Python3




# Python 3 program for the above approach
 
# Function to find the gcd of a and b
def gcd(a, b):
    if (b == 0):
        return a
    return gcd(b, a % b)
 
# Function to find the number of Ks
def calculateK(x, y):
 
    # Find gcd
    g = gcd(x, y)
    n = y // g
    res = n
 
    # Calculating value of totient
    # function for n
    i = 2
    while i * i <= n:
        if (n % i == 0):
            res -= (res // i)
            while (n % i == 0):
                n //= i
        i += 1
    if (n != 1):
        res -= (res // n)
    return res
 
# Driver Code
if __name__ == "__main__":
 
    # Given X and Y
    x = 3
    y = 15
 
    print(calculateK(x, y))
     
    # This code is contributed by chitranayal.


C#




// C# program for the above approach
using System;
 
class GFG{
 
// Function to find the gcd of a and b
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
         
    return gcd(b, a % b);
}
 
// Function to find the number of Ks
static int calculateK(int x, int y)
{
     
    // Find gcd
    int g = gcd(x, y);
    int n = y / g;
    int res = n;
 
    // Calculating value of totient
    // function for n
    for(int i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            res -= (res / i);
             
            while (n % i == 0)
                n /= i;
        }
    }
    if (n != 1)
        res -= (res / n);
         
    return res;
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given X and Y
    int x = 3, y = 15;
     
    Console.Write(calculateK(x, y) + "\n");
}
}
 
// This code is contributed by gauravrajput1


Javascript




<script>
// javascript program for the above approach
 
    // Function to find the gcd of a and b
    function gcd(a , b) {
 
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }
 
    // Function to find the number of Ks
    function calculateK(x , y) {
 
        // Find gcd
        var g = gcd(x, y);
        var n = y / g;
        var res = n;
 
        // Calculating value of totient
        // function for n
        for (i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                res -= (res / i);
                while (n % i == 0)
                    n /= i;
            }
        }
        if (n != 1)
            res -= (res / n);
        return res;
    }
 
    // Driver Code
     
        // Given X and Y
        var x = 3, y = 15;
        document.write(calculateK(x, y) + "\n");
 
// This code is contributed by umadevi9616
</script>


Output: 

4

 

Time Complexity: O(log(min(X, Y)) + ?N) where N is Y/gcd(X, Y).
Auxiliary Space: O(1)

 



Last Updated : 14 Apr, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads