Open In App

Minimum divisions to reduce N to 1 by following given conditions

Last Updated : 19 May, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given an integer N, the task is to find the minimum number of divisions required to reduce the number to 1 when the divisions follow the given criteria:

  • Pick two integers X and Y such that X+Y  is even.
  • Replace N with N/XY where XY is a divisor of N

Note: If it is impossible to reduce N to 1, then return -1.

Examples:

Input: N = 35
Output: 1
Explanation: Select X = 35 and Y = 1. X+Y = 36 which is even,  
and XY = 35 is a divisor of N = 35 so this is a valid choice.

Input: 44
Output: 2

 

Approach: The problem can be solved based on the following mathematical observation:

  • If N is odd then X can be chosen as X = N and Y = 1. So XY = X = N and also X + Y = X + 1 = even.
  • If N is even then N can be written as N = 2p * X where p is any integer and X is an odd number (can be 1). 
    • If p is odd then it is never possible to reduce the number to 1 as 2 + p will always be odd.
    • Otherwise, it will take 2 moves to reduce the number to 1: One step to reduce the number to X and another step to reduce it from X to 1.
    • If X = 1 then no 2nd step is needed and 1 step will be sufficient.

Follow the steps mentioned below to solve the problem:

  • Find if the number is odd or even.
  • If the number is even then:
    • If 2 is raised to an odd power, then the answer is not possible.
    • Otherwise, get the minimum number of steps as shown in the above observation.
  • If the number is odd, it takes only one step.

Below is the implementation of the above approach.

C++




// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find
// the minimum number of moves
int minStep(long N)
{
    if (N == 1)
        return 0;
 
    // If number input by user is odd
    else if (N % 2 == 1)
        return 1;
    else {
        float X;
        int count = 0;
 
        // Finding square root of
        // integer input by user
        X = sqrt(N);
 
        // Is perfect square
        if (X == round(X)) {
            return 1;
        }
        else {
 
            // Checking number is divisible by 2
            while (N % 2 == 0) {
                N /= 2;
                count++;
            }
 
            // Check value of count is
            // odd or even
            if (count % 2 == 0)
                return 2;
            else
                return -1;
        }
    }
}
 
// Driver code
int main()
{
    long N = 35;
 
    // Function call
    cout << (minStep(N));
 
    return 0;
}
 
    // This code is contributed by rakeshsahni


C




// C code to implement the approach
#include <math.h>
#include <stdio.h>
 
// Function to find
// the minimum number of moves
int minStep(long N)
{
    if (N == 1)
        return 0;
 
    // If number input by user is odd
    else if (N % 2 == 1)
        return 1;
    else {
        float X;
        int count = 0;
 
        // Finding square root of
        // integer input by user
        X = sqrt(N);
 
        // Is perfect square
        if (X == round(X)) {
            return 1;
        }
        else {
 
            // Checking number is divisible by 2
            while (N % 2 == 0) {
                N /= 2;
                count++;
            }
            // Check value of count is
            // odd or even
            if (count % 2 == 0)
                return 2;
            else
                return -1;
        }
    }
}
 
// Driver code
int main()
{
    long N = 35;
 
    // Function call
    printf("%d",minStep(N));
    return 0;
}
 
// This code is contributed by Aarohi Rai


Java




// java code to implement the approach
 
import java.util.*;
 
class GFG {
 
    // Function to find
    // the minimum number of moves
    public static int minStep(long N)
    {
        if (N == 1)
            return 0;
 
        // If number input by user is odd
        else if (N % 2 == 1)
            return 1;
        else {
            Double X;
            int count = 0;
 
            // Finding square root of
            // integer input by user
            X = Math.sqrt(N);
 
            // Is perfect square
            if (X == Math.round(X)) {
                return 1;
            }
            else {
 
                // Checking number is divisible by 2
                while (N % 2 == 0) {
                    N /= 2;
                    count++;
                }
 
                // Check value of count is
                // odd or even
                if (count % 2 == 0)
                    return 2;
                else
                    return -1;
            }
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        long N = 35;
 
        // Function call
        System.out.println(minStep(N));
    }
}


Python3




# Python code to implement the approach
import math
 
# Function to find
# the minimum number of moves
def minStep(N):
    if N == 1:
        return 0
    # If number input by user is odd
    elif N % 2 == 1:
        return 1
    else:
        X = 0.0
        count = 0
        # Finding square root of
        # integer input by user
        X = math.sqrt(N)
        # Is perfect square
        if X == round(X):
            return 1
 
        else:
            # Checking number is divisible by 2
            while N % 2 == 0:
                N /= 2
                count += 1
 
            # Check value of count is
            # odd or even
            if count % 2 == 0:
                return 2
            else:
                return -1
 
 
# Driver code
if __name__ == "__main__":
    N = 35
    # Function call
    print(minStep(N))
 
 
# This code is contributed by Rohit Pradhan


C#




// C# code to implement the approach
using System;
 
class GFG {
 
    // Function to find
    // the minimum number of moves
    static int minStep(long N)
    {
        if (N == 1)
            return 0;
 
        // If number input by user is odd
        else if (N % 2 == 1)
            return 1;
        else {
            double X = 0;
            int count = 0;
 
            // Finding square root of
            // integer input by user
            X = Math.Sqrt(N);
 
            // Is perfect square
            if (X == Math.Round(X)) {
                return 1;
            }
            else {
 
                // Checking number is divisible by 2
                while (N % 2 == 0) {
                    N /= 2;
                    count++;
                }
 
                // Check value of count is
                // odd or even
                if (count % 2 == 0)
                    return 2;
                else
                    return -1;
            }
        }
    }
 
    // Driver code
    public static void Main()
    {
        long N = 35;
 
        // Function call
        Console.WriteLine(minStep(N));
    }
}
 
// This code is contributed by Samim Hossain Mondal.


Javascript




<script>
 
// JavaScript code to implement the approach
 
// Function to find
// the minimum number of moves
function minStep(N)
{
    if (N == 1)
        return 0;
 
    // If number input by user is odd
    else if (N % 2 == 1)
        return 1;
    else {
        let X;
        let count = 0;
 
        // Finding square root of
        // integer input by user
        X = Math.sqrt(N);
 
        // Is perfect square
        if (X == Math.round(X)) {
            return 1;
        }
        else {
 
            // Checking number is divisible by 2
            while (N % 2 == 0) {
                N = Math.floor(N/2);
                count++;
            }
 
            // Check value of count is
            // odd or even
            if (count % 2 == 0)
                return 2;
            else
                return -1;
        }
    }
}
 
// Driver code
let N = 35;
 
// Function call
document.write(minStep(N),"</br>");
 
// This code is contributed by shinjanpatra
 
</script>


Output

1

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



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads