Reach A and B by multiplying them with K and K^2 at every step

We are given two numbers A and B, we need to write a program to determine if A and B can be reached starting from (1, 1) following the given steps. Start from (1, 1) and at every step choose a random number K and multiply K to any one of the two numbers obtained in the previous step and K2 to the other number.

Examples:

Input : A = 3,   B = 9 
Output : yes
Explanation: Starting from A = 1 and B = 1. 
We choose k=3 and multiply 3 with the first number
to get A=3 and multiply k2=9 to the second- 
number to get B=9. 

Input : A = 60,   B = 450 
Output : yes
Explanation : Starting from A = 1 and B = 1,
Step 1: multiply k=3 and k2 to get 3 and 9 
Step 2: Multiply k=5 and k2 = 25 to get to 15 and 225 
Step 3: Multiply k2=4 and k=2 to get to A=60 and B=450 

The idea to solve this problem is to observe closely that at each step we are multiplying k and k2 to the numbers. So if A and B can be reached, it will have k^3 at every step as factors in A*B. In simple words, if the number A*B is a perfect cube and it divides A and B both, only then the number can be reached starting from 1 and 1 by performing given steps.

Below is the implementation of above idea:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to determine if
// A and B can be reached starting
// from 1, 1 following the given steps.
#include <bits/stdc++.h>
using namespace std;
  
// function to check is it is possible to reach
// A and B starting from 1 and 1
bool possibleToReach(int a, int b)
{
    // find the cuberoot of the number
    int c = cbrt(a * b);
  
    // divide the number by cuberoot
    int re1 = a / c;
    int re2 = b / c;
  
    // if it is a perfect cuberoot and divides a and b
    if ((re1 * re1 * re2 == a) && (re2 * re2 * re1 == b))
        return true;
    else
        return false;
}
  
int main()
{
    int A = 60, B = 450;
  
    if (possibleToReach(A, B))
        cout << "yes";
    else
        cout << "no";
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to determine if
// A and B can be reached starting
// from 1, 1 following the given 
// steps.
class GFG {
      
    // function to check is it is 
    // possible to reach A and B 
    // starting from 1 and 1
    static boolean possibleToReach(int a, int b)
    {
          
        // find the cuberoot of the number
        int c = (int)Math.cbrt(a * b);
  
        // divide the number by cuberoot
        int re1 = a / c;
        int re2 = b / c;
  
        // if it is a perfect cuberoot and 
        // divides a and b
        if ((re1 * re1 * re2 == a) && 
                         (re2 * re2 * re1 == b))
            return true;
        else
            return false;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int A = 60, B = 450;
  
        if (possibleToReach(A, B))
            System.out.println("yes");
        else
            System.out.println("no");
    }
}
  
// This code is contributed by
// Smitha Dinesh Semwal

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to determine if
# A and B can be reached starting
# from 1, 1 following the given steps.
import numpy as np
  
# function to check is it is possible to 
# reach A and B starting from 1 and 1
def possibleToReach(a, b):
  
    # find the cuberoot of the number
    c = np.cbrt(a * b)
  
    # divide the number by cuberoot
    re1 = a // c
    re2 = b // c
  
    # if it is a perfect cuberoot and
    # divides a and b
    if ((re1 * re1 * re2 == a) and 
        (re2 * re2 * re1 == b)):
        return True
    else:
        return False
  
# Driver Code
if __name__ == "__main__":
      
    A = 60
    B = 450
  
    if (possibleToReach(A, B)):
        print("yes")
    else:
        print("no")
  
# This code is contributed by ita_c

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to determine if
// A and B can be reached starting
// from 1, 1 following the given 
// steps.
using System;
  
public class GFG{
      
    // function to check is it is 
    // possible to reach A and B 
    // starting from 1 and 1
    public static bool possibleToReach(int a, int b)
    {
          
        // find the cuberoot of the number
        int c = (int)Math.Pow(a * b, (double) 1 / 3);
        // divide the number by cuberoot
        int re1 = a / c;
        int re2 = b / c;
  
        // if it is a perfect cuberoot  
        // and divides a and b
        if ((re1 * re1 * re2 == a) && 
              (re2 * re2 * re1 == b))
            return true;
        else
            return false;
    }
  
// Driver Code 
    static public void Main (String []args)
    {
          
        int A = 60, B = 450;
  
        if (possibleToReach(A, B))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
  
// This code is contributed by Ajit.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to determine if
// A and B can be reached starting
// from 1, 1 following the given steps.
  
// function to check is it is
// possible to reach A and B 
// starting from 1 and 1
function possibleToReach($a, $b)
{
      
    // find the cuberoot
    // of the number
    $c =($a * $b);
  
    // divide the number
    // by cuberoot
    $re1 = $a / $c;
    $re2 = $b / $c;
  
    // if it is a perfect cuberoot
    // and divides a and b
    if (($re1 * $re1 * $re2 == $a) && 
        ($re2 * $re2 * $re1 == $b))
        return 1;
    else
        return -1;
}
  
    // Driver Code
    $A = 60; 
    $B = 450;
    if (possibleToReach($A, $B))
        echo "yes";
    else
        echo "no";
          
// This code is contributed by aj_36
?>

chevron_right



Output:

Yes


My Personal Notes arrow_drop_up

Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.