# Check if X can be converted to Y by converting to 3 * (X / 2) or X – 1 in each operation

• Last Updated : 11 Jun, 2021

Given two positive integers X and Y, the task is to check if X can be converted to Y or not by repeatedly changing the value of X to (3 * X / 2) (if X is even) or (X – 1). If it is possible to convert X into Y, then print “Yes”. Otherwise, print “No”.

Examples:

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

Input: X = 6, Y = 8
Output: Yes
Explanation:
Operation 1: Convert X(= 6) to 3*X/2 ( = 3 * (6 / 2) = 9).
Operation 2: Convert X(= 9) to (X – 1) (= 8).
Therefore, the total number of operations required is 2.

Input: X = 3, Y = 6
Output: No

Approach: The given problem can be solved based on the following observations:

• If the value of X is at least Y, then X can always be converted to Y using the second operation, i.e. reducing X by 1.
• If X is even, then it can be converted to (3 * (X / 2)), which is greater than X for all even numbers greater than 0.
• If the value of X is odd, then X can be converted to (X – 1), which can be converted into (3 * (X – 1)/2), which is greater than X.
• Therefore, from the above observations, the conversion of X into Y is always possible for X > 3.
• Following base cases are required to be considered:
• X = 1: Conversion possible only if Y = 1.
• X = 2 or X = 3: Conversion possible only if Y ≤ 3.
• In all the other cases, conversion is not possible.

Follow the steps below to solve the problem:

• If the value X is greater than 4, then print “Yes”.
• If the value X is 1 and Y is 1, then print “Yes”.
• If the value X is 2 or 3 and Y is less than 4, then print “Yes”.
• Otherwise, print “No” for all the other cases.

Below is the implementation of above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to check if X can be``// made equal to Y by converting``// X to (3*X/2) or (X - 1)``void` `check(``int` `X, ``int` `Y)``{``    ``// Conditions for possible conversion``    ``if` `(X > 3) {``        ``cout << ``"Yes"``;``    ``}` `    ``else` `if` `(X == 1 and Y == 1) {``        ``cout << ``"Yes"``;``    ``}` `    ``else` `if` `(X == 2 and Y <= 3) {``        ``cout << ``"Yes"``;``    ``}` `    ``else` `if` `(X == 3 and Y <= 3) {``        ``cout << ``"Yes"``;``    ``}` `    ``// Otherwise, conversion``    ``// is not possible``    ``else` `{``        ``cout << ``"No"``;``    ``}``}` `// Driver Code``int` `main()``{``    ``int` `X = 6, Y = 8;``    ``check(X, Y);` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``class` `GFG{``    ` `// Function to check if X can be``// made equal to Y by converting``// X to (3*X/2) or (X - 1)``static` `void` `check(``int` `X, ``int` `Y)``{``    ` `    ``// Conditions for possible conversion``    ``if` `(X > ``3``)``    ``{``        ``System.out.print(``"Yes"``);``    ``}` `    ``else` `if` `(X == ``1` `&& Y == ``1``)``    ``{``        ``System.out.print(``"Yes"``);``    ``}` `    ``else` `if` `(X == ``2` `&& Y <= ``3``)``    ``{``        ``System.out.print(``"Yes"``);``    ``}` `    ``else` `if` `(X == ``3` `&& Y <= ``3``)``    ``{``        ``System.out.print(``"Yes"``);``    ``}` `    ``// Otherwise, conversion``    ``// is not possible``    ``else``    ``{``        ``System.out.print(``"No"``);``    ``}``}` `// Driver Code``public` `static` `void` `main (String[] args)``{``    ``int` `X = ``6``, Y = ``8``;``    ` `    ``check(X, Y);``}``}` `// This code is contributed by AnkThon`

## Python3

 `# Python3 program for the above approach` `# Function to check if X can be``# made equal to Y by converting``# X to (3*X/2) or (X - 1)``def` `check(X, Y):``    ` `    ``# Conditions for possible conversion``    ``if` `(X > ``3``):``        ``print``(``"Yes"``)` `    ``elif` `(X ``=``=` `1` `and` `Y ``=``=` `1``):``        ``print``(``"Yes"``)` `    ``elif` `(X ``=``=` `2` `and` `Y <``=` `3``):``        ``print``(``"Yes"``)` `    ``elif` `(X ``=``=` `3` `and` `Y <``=` `3``):``        ``print``(``"Yes"``)` `    ``# Otherwise, conversion``    ``# is not possible``    ``else``:``        ``print``(``"No"``)` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``X ``=` `6``    ``Y ``=` `8``    ` `    ``check(X, Y)` `# This code is contributed by ipg2016107`

## C#

 `// C# program for the above approach``using` `System;` `class` `GFG{` `// Function to check if X can be``// made equal to Y by converting``// X to (3*X/2) or (X - 1)``static` `void` `check(``int` `X, ``int` `Y)``{``    ` `    ``// Conditions for possible conversion``    ``if` `(X > 3)``    ``{``        ``Console.WriteLine(``"Yes"``);``    ``}` `    ``else` `if` `(X == 1 && Y == 1)``    ``{``        ``Console.WriteLine(``"Yes"``);``    ``}` `    ``else` `if` `(X == 2 && Y <= 3)``    ``{``        ``Console.WriteLine(``"Yes"``);``    ``}` `    ``else` `if` `(X == 3 && Y <= 3)``    ``{``        ``Console.WriteLine(``"Yes"``);``    ``}` `    ``// Otherwise, conversion``    ``// is not possible``    ``else``    ``{``        ``Console.WriteLine(``"No"``);``    ``}``}` `// Driver Code``public` `static` `void` `Main(``string``[] args)``{``    ``int` `X = 6, Y = 8;``    ` `    ``check(X, Y);``}``}` `// This code is contributed by avijitmondal1998`

## Javascript

 ``
Output:
`Yes`

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

My Personal Notes arrow_drop_up