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

Last Updated : 23 Jul, 2025

Given two integers X and Y, the task is to find the number of integers, K, such that gcd(X, Y)is equal togcd(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 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

`

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:

Below is the implementation of the above approach:

C++ `

// C++ program for the above approach

#include 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

`

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