# Min operations to reduce N by multiplying by any number or taking square root

Given a number **N**, the task is to find the minimum value of **N** by applying below operations any number of times:

- Multiply
**N**by any positive integer - Replace
**N**with**sqrt(N)**, only if N is a perfect square.

**Examples:**

Input:N = 20Output:10Explanation:

Multiply -> 20 * 5 = 100

sqrt(100) = 10, which is the minimum value obtainable.

Input:N = 5184Output:6Explanation:

sqrt(5184) = 72.

Multiply -> 72*18 = 1296

sqrt(1296) = 6, which is the minimum value obtainable.

**Approach**: This problem can be solved using Greedy Approach. Below are the steps:

- Keep replacing
**N**to**sqrt(N)**until**N**is a perfect square. - After the above step, iterate from
**sqrt(N)**to**2**, and for every, i keep replacing**N**with**N / i**if**N is divisible by i**.^{2} - The value of
**N**after the above step will be the minimum possible value.

Below is the implementation of the above approach:

## C++

`// C++ program for above approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to reduce N to its minimum` `// possible value by the given operations` `void` `minValue(` `int` `n)` `{` ` ` `// Keep replacing n until is` ` ` `// an integer` ` ` `while` `(` `int` `(` `sqrt` `(n)) == ` `sqrt` `(n)` ` ` `&& n > 1) {` ` ` `n = ` `sqrt` `(n);` ` ` `}` ` ` `// Keep replacing n until n` ` ` `// is divisible by i * i` ` ` `for` `(` `int` `i = ` `sqrt` `(n);` ` ` `i > 1; i--) {` ` ` `while` `(n % (i * i) == 0)` ` ` `n /= i;` ` ` `}` ` ` `// Print the answer` ` ` `cout << n;` `}` `// Driver Code` `int` `main()` `{` ` ` `// Given N` ` ` `int` `N = 20;` ` ` `// Function Call` ` ` `minValue(N);` `}` |

## Java

`// Java implementation of the above approach` `import` `java.lang.Math;` `class` `GFG{` `// Function to reduce N to its minimum` `// possible value by the given operations` `static` `void` `minValue(` `int` `n)` `{` ` ` ` ` `// Keep replacing n until is` ` ` `// an integer` ` ` `while` `((` `int` `)Math.sqrt(n) ==` ` ` `Math.sqrt(n) && n > ` `1` `)` ` ` `{` ` ` `n = (` `int` `)(Math.sqrt(n));` ` ` `}` ` ` `// Keep replacing n until n` ` ` `// is divisible by i * i` ` ` `for` `(` `int` `i = (` `int` `)(Math.sqrt(n));` ` ` `i > ` `1` `; i--)` ` ` `{` ` ` `while` `(n % (i * i) == ` `0` `)` ` ` `n /= i;` ` ` `}` ` ` ` ` `// Print the answer` ` ` `System.out.println(n);` `}` `// Driver code` `public` `static` `void` `main(String args[])` `{` ` ` ` ` `// Given N` ` ` `int` `N = ` `20` `;` ` ` ` ` `// Function call` ` ` `minValue(N);` `}` `}` `// This code is contributed by vikas_g` |

## Python3

`# Python3 program for the above approach` `import` `math` `# Function to reduce N to its minimum` `# possible value by the given operations` `def` `MinValue(n):` ` ` ` ` `# Keep replacing n until is` ` ` `# an integer` ` ` `while` `(` `int` `(math.sqrt(n)) ` `=` `=` ` ` `math.sqrt(n) ` `and` `n > ` `1` `):` ` ` `n ` `=` `math.sqrt(n)` ` ` ` ` `# Keep replacing n until n` ` ` `# is divisible by i * i` ` ` `for` `i ` `in` `range` `(` `int` `(math.sqrt(n)), ` `1` `, ` `-` `1` `):` ` ` `while` `(n ` `%` `(i ` `*` `i) ` `=` `=` `0` `):` ` ` `n ` `/` `=` `i` ` ` ` ` `# Print the answer` ` ` `print` `(n)` `# Driver code` `n ` `=` `20` `# Function call` `MinValue(n)` `# This code is contributed by virusbuddah_` |

## C#

`// C# implementation of the approach` `using` `System;` `class` `GFG{` ` ` `// Function to reduce N to its minimum` `// possible value by the given operations` `static` `void` `minValue(` `int` `n)` `{` ` ` ` ` `// Keep replacing n until is` ` ` `// an integer` ` ` `while` `((` `int` `)Math.Sqrt(n) ==` ` ` `Math.Sqrt(n) && n > 1)` ` ` `{` ` ` `n = (` `int` `)(Math.Sqrt(n));` ` ` `}` ` ` ` ` `// Keep replacing n until n` ` ` `// is divisible by i * i` ` ` `for` `(` `int` `i = (` `int` `)(Math.Sqrt(n));` ` ` `i > 1; i--)` ` ` `{` ` ` `while` `(n % (i * i) == 0)` ` ` `n /= i;` ` ` `}` ` ` ` ` `// Print the answer` ` ` `Console.Write(n);` `}` `// Driver code` `public` `static` `void` `Main()` `{` ` ` ` ` `// Given N` ` ` `int` `N = 20;` ` ` ` ` `// Function call` ` ` `minValue(N);` `}` `}` `// This code is contributed by vikas_g` |

## Javascript

`<script>` `// Javascript program for above approach` `// Function to reduce N to its minimum` `// possible value by the given operations` `function` `minValue(n)` `{` ` ` `// Keep replacing n until is` ` ` `// an integer` ` ` `while` `(parseInt(Math.sqrt(n)) == Math.sqrt(n)` ` ` `&& n > 1)` ` ` `{` ` ` `n = parseInt(Math.sqrt(n));` ` ` `}` ` ` `// Keep replacing n until n` ` ` `// is divisible by i * i` ` ` `for` `(` `var` `i = parseInt(Math.sqrt(n));` ` ` `i > 1; i--) {` ` ` `while` `(n % (i * i) == 0)` ` ` `n /= i;` ` ` `}` ` ` `// Print the answer` ` ` `document.write(n);` `}` `// Driver Code` `// Given N` `var` `N = 20;` `// Function Call` `minValue(N);` `// This code is contributed by rutvik_56.` `</script>` |

**Output:**

10

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