Given two positive integers A and B. The task is to minimize operations required to reduce A and B to 1. There are two types of operation:
- Decrement either A or B by 1.
- Divide A by B or B by A or perform both divisions simultaneously only if the remainder on division is 0.
Example:
Input: A = 13, B = 5 Output: 6 Explanation: Below are the operations performed to reduce A and B to 1.
Initially A = 13, B = 5 Step 1: Decrement A by 1: A = 12, B = 5 Step 2: Decrement B by 1: A = 12, B = 4 Step 3: Divide A by B and assign it to A : A = 3, B = 4 Step 4: Decrement B by 1: A = 3 B = 3 Step 5: Divide both A by B and B by A, assign it to A and B respectively: A = 1, B = 1 Therefore, total 5 steps required to reduce A and B to 1. Which is minimum possible.
Input: A = 3, B = 27 Output: 3
Approach: This problem can be solved by using recursion. Create a recursive and Take a variable say cntOperations = 0 to keep track of the number of operations performed. For base condition check if A=1 and B=1, then return cntOperations otherwise, check for each possible operation that can be performed.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int solve( int A, int B, int ans = 0)
{
if (A == 1 && B == 1) {
return ans;
}
if (A % B == 0 && B % A == 0) {
return solve(A / B, B / A, ans + 1);
}
else if (A % B == 0 && B % A != 0) {
return solve(A / B, B, ans + 1);
}
else if (A % B != 0 && B % A == 0) {
return solve(A, B / A, ans + 1);
}
else if ((A - 1) % 2 == 0) {
return solve(A - 1, B, ans + 1);
}
else if ((B - 1) % 2 == 0) {
return solve(A, B - 1, ans + 1);
}
else {
if (A < B) {
return solve(A - 1, B, ans + 1);
}
else {
return solve(A, B - 1, ans + 1);
}
}
}
int main()
{
int A = 13;
int B = 5;
cout << solve(A, B);
}
|
Java
class GFG
{
public static int solve( int A, int B, int ans)
{
if (A == 1 && B == 1 ) {
return ans;
}
if (A % B == 0 && B % A == 0 ) {
return solve(A / B, B / A, ans + 1 );
}
else if (A % B == 0 && B % A != 0 ) {
return solve(A / B, B, ans + 1 );
}
else if (A % B != 0 && B % A == 0 ) {
return solve(A, B / A, ans + 1 );
}
else if ((A - 1 ) % 2 == 0 ) {
return solve(A - 1 , B, ans + 1 );
}
else if ((B - 1 ) % 2 == 0 ) {
return solve(A, B - 1 , ans + 1 );
}
else {
if (A < B) {
return solve(A - 1 , B, ans + 1 );
}
else {
return solve(A, B - 1 , ans + 1 );
}
}
}
public static void main(String args[]) {
int A = 13 ;
int B = 5 ;
System.out.println(solve(A, B, 0 ));
}
}
|
Python3
def solve(A, B, ans = 0 ):
if (A = = 1 and B = = 1 ):
return ans
if (A % B = = 0 and B % A = = 0 ):
return solve(A / / B, B / / A, ans + 1 )
elif (A % B = = 0 and B % A ! = 0 ):
return solve(A / / B, B, ans + 1 )
elif (A % B ! = 0 and B % A = = 0 ):
return solve(A, B / / A, ans + 1 )
elif ((A - 1 ) % 2 = = 0 ):
return solve(A - 1 , B, ans + 1 )
elif ((B - 1 ) % 2 = = 0 ):
return solve(A, B - 1 , ans + 1 )
else :
if (A < B):
return solve(A - 1 , B, ans + 1 )
else :
return solve(A, B - 1 , ans + 1 )
if __name__ = = "__main__" :
A = 13
B = 5
print (solve(A, B))
|
C#
using System;
public class GFG
{
static int solve( int A, int B, int ans)
{
if (A == 1 && B == 1) {
return ans;
}
if (A % B == 0 && B % A == 0) {
return solve(A / B, B / A, ans + 1);
}
else if (A % B == 0 && B % A != 0) {
return solve(A / B, B, ans + 1);
}
else if (A % B != 0 && B % A == 0) {
return solve(A, B / A, ans + 1);
}
else if ((A - 1) % 2 == 0) {
return solve(A - 1, B, ans + 1);
}
else if ((B - 1) % 2 == 0) {
return solve(A, B - 1, ans + 1);
}
else {
if (A < B) {
return solve(A - 1, B, ans + 1);
}
else {
return solve(A, B - 1, ans + 1);
}
}
}
public static void Main(String[] args)
{
int A = 13;
int B = 5;
Console.WriteLine(solve(A, B, 0));
}
}
|
Javascript
<script>
const solve = (A, B, ans = 0) => {
if (A == 1 && B == 1) {
return ans;
}
if (A % B == 0 && B % A == 0) {
return solve(parseInt(A / B), parseInt(B / A), ans + 1);
}
else if (A % B == 0 && B % A != 0) {
return solve(parseInt(A / B), B, ans + 1);
}
else if (A % B != 0 && B % A == 0) {
return solve(A, parseInt(B / A), ans + 1);
}
else if ((A - 1) % 2 == 0) {
return solve(A - 1, B, ans + 1);
}
else if ((B - 1) % 2 == 0) {
return solve(A, B - 1, ans + 1);
}
else {
if (A < B) {
return solve(A - 1, B, ans + 1);
}
else {
return solve(A, B - 1, ans + 1);
}
}
}
let A = 13;
let B = 5;
document.write(solve(A, B));
</script>
|
Time Complexity: O(max(A, B))
Auxiliary Space: O(1)
|