 Open in App
Not now

# Largest Divisor of a Number not divisible by a perfect square

• Difficulty Level : Medium
• Last Updated : 02 Jul, 2022

Given a positive integer, N. Find the largest divisor of the given number that is not divisible by a perfect square greater than 1.

Examples:

```Input : 12
Output : 6
Explanation : Divisors of 12 are 1, 2, 3, 4, 6 and 12.
Since 12 is divisible by 4 (a perfect square),
it can't be required divisor. 6 is not divisible
by any perfect square.

Input :97
Output :97```

A simple approach is to find all the divisors of the given number N by iterating up to the square root of N and keep them in sorted order(Descending) in a list. Here we are inserting them in a set in descending order to keep them sorted. Also, make a list of all perfect squares up to 1010 by iterating from 1 to 105
Now, for each divisor starting from the greatest one, check whether it is divisible by any perfect square in the list or not. If a divisor is not divisible by any perfect, simply return it as the answer.

Below is the implementation of the above approach.

## C++

 `// C++ Program to find the largest``// divisor not divisible by any``// perfect square greater than 1``#include ``using` `namespace` `std;` `const` `int` `MAX = 1e5;` `// Function to find the largest``// divisor not divisible by any``// perfect square greater than 1``int` `findLargestDivisor(``int` `n)``{``    ``// set to store divisors in``    ``// descending order``    ``int` `m = n;``    ``set<``int``, greater<``int``> > s;``    ``s.insert(1);``    ``s.insert(n);` `    ``for` `(``int` `i = 2; i < ``sqrt``(n) + 1; i++) {``        ``// If the number is divisible``        ``// by i, then insert it``        ``if` `(n % i == 0) {``            ``s.insert(n / i);``            ``s.insert(i);``            ``while` `(m % i == 0)``                ``m /= i;``        ``}``    ``}` `    ``if` `(m > 1)``        ``s.insert(m);` `    ``// Vector to store perfect squares``    ``vector<``int``> vec;``    ``for` `(``int` `i = 2; i <= MAX; i++)``        ``vec.push_back(i * i);` `    ``// Check for each divisor, if it is not``    ``// divisible by any perfect square,``    ``// simply return it as the answer.``    ``for` `(``auto` `d : s) {``        ``int` `divi = 0;``        ``for` `(``int` `j = 0; j < vec.size()``                        ``&& vec[j] <= d;``             ``j++) {``            ``if` `(d % vec[j] == 0) {``                ``divi = 1;``                ``break``;``            ``}``        ``}``        ``if` `(!divi)``            ``return` `d;``    ``}``}` `// Driver Code``int` `main()``{``    ``int` `n = 12;``    ``cout << findLargestDivisor(n) << endl;` `    ``n = 97;``    ``cout << findLargestDivisor(n) << endl;``    ``return` `0;``}`

## Java

 `// Java Program to find the largest``// divisor not divisible by any``// perfect square greater than 1``import` `java.util.*;``class` `Main{``    ` `static` `int` `MAX = (``int``)1e5;``    ` `// Function to find the largest``// divisor not divisible by any``// perfect square greater than 1``public` `static` `int` `findLargestDivisor(``int` `n)``{``  ``// set to store divisors in``  ``// descending order``  ``int` `m = n;``  ``Set s =``      ``new` `HashSet();``  ``s.add(``1``);``  ``s.add(n);` `  ``for` `(``int` `i = ``2``;``           ``i < (``int``)Math.sqrt(n) + ``1``; i++)``  ``{``    ``// If the number is divisible``    ``// by i, then insert it``    ``if` `(n % i == ``0``)``    ``{``      ``s.add(n / i);``      ``s.add(i);``      ``while` `(m % i == ``0``)``        ``m /= i;``    ``}``  ``}` `  ``if` `(m > ``1``)``    ``s.add(m);` `  ``List l =``       ``new` `ArrayList(s);` `  ``Collections.sort(l);``  ``Collections.reverse(l);` `  ``// Vector to store``  ``// perfect squares``  ``Vector vec =``         ``new` `Vector();` `  ``for` `(``int` `i = ``2``; i <= MAX; i++)``    ``vec.add(i * i);` `  ``// Check for each divisor, if``  ``// it is not divisible by any``  ``// perfect square, simply return``  ``// it as the answer.``  ``for` `(``int` `d : l)``  ``{``    ``int` `divi = ``0``;``    ` `    ``for` `(``int` `j = ``0``;``             ``j < vec.size() &&``             ``vec.get(j) <= d; j++)``    ``{``      ``if` `(d % vec.get(j) == ``0``)``      ``{``        ``divi = ``1``;``        ``break``;``      ``}``    ``}``    ``if` `(divi == ``0``)``      ``return` `d;``  ``}``  ``return` `0``;``}` `// Driver code   ``public` `static` `void` `main(String[] args)``{``  ``int` `n = ``12``;``  ``System.out.println(findLargestDivisor(n));` `  ``n = ``97``;``  ``System.out.println(findLargestDivisor(n));``}``}` `// This code is contributed by divyeshrabadiya07`

## Python3

 `# Python3 Program to find the largest``# divisor not divisible by any``# perfect square greater than 1` `MAX` `=` `10` `*``*` `5` `# Function to find the largest``# divisor not divisible by any``# perfect square greater than 1``def` `findLargestDivisor(n):` `    ``# set to store divisors in``    ``# descending order``    ``m ``=` `n``    ``s ``=` `set``()``    ``s.add(``1``)``    ``s.add(n)` `    ``for` `i ``in` `range``(``2``, ``int``(n ``*``*` `(``0.5``)) ``+` `1``):``        ` `        ``# If the number is divisible``        ``# by i, then insert it``        ``if` `n ``%` `i ``=``=` `0``:``            ``s.add(n ``/``/` `i)``            ``s.add(i)``            ``while` `m ``%` `i ``=``=` `0``:``                ``m ``/``/``=` `i``        ` `    ``if` `m > ``1``:``        ``s.add(m)` `    ``# Vector to store perfect squares``    ``vec ``=` `[i``*``*``2` `for` `i ``in` `range``(``2``, ``MAX` `+` `1``)]` `    ``# Check for each divisor, if it is not``    ``# divisible by any perfect square,``    ``# simply return it as the answer.``    ``for` `d ``in` `sorted``(s, reverse ``=` `True``):``        ` `        ``divi, j ``=` `0``, ``0``        ``while` `j < ``len``(vec) ``and` `vec[j] <``=` `d:` `            ``if` `d ``%` `vec[j] ``=``=` `0``:``                ``divi ``=` `1``                ``break``            ``j ``+``=` `1`       `        ` `        ``if` `not` `divi:``            ``return` `d` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:` `    ``n ``=` `12``    ``print``(findLargestDivisor(n))` `    ``n ``=` `97``    ``print``(findLargestDivisor(n))``    ` `# This code is contributed by Rituraj Jain`

## C#

 `// C# program to find the largest``// divisor not divisible by any``// perfect square greater than 1``using` `System;``using` `System.Collections.Generic;` `class` `GFG{``    ` `static` `int` `MAX = (``int``)1e5;` `// Function to find the largest``// divisor not divisible by any``// perfect square greater than 1``static` `int` `findLargestDivisor(``int` `n)``{``    ` `    ``// Set to store divisors in``    ``// descending order``    ``int` `m = n;``    ` `    ``HashSet<``int``> s = ``new` `HashSet<``int``>();``    ``s.Add(1);``    ``s.Add(n);``    ` `    ``for``(``int` `i = 2;``            ``i < (``int``)Math.Sqrt(n) + 1;``            ``i++)``    ``{``        ` `        ``// If the number is divisible``        ``// by i, then insert it``        ``if` `(n % i == 0)``        ``{``            ``s.Add(n / i);``            ``s.Add(i);``            ` `            ``while` `(m % i == 0)``                ``m /= i;``        ``}``    ``}``    ` `    ``if` `(m > 1)``        ``s.Add(m);``    ` `    ``List<``int``> l = ``new` `List<``int``>(s);``    ``l.Sort();``    ``l.Reverse();``    ` `    ``// Vector to store``    ``// perfect squares``    ``List<``int``> vec = ``new` `List<``int``>();``    ` `    ``for``(``int` `i = 2; i <= MAX; i++)``        ``vec.Add(i * i);``    ` `    ``// Check for each divisor, if``    ``// it is not divisible by any``    ``// perfect square, simply return``    ``// it as the answer.``    ``foreach``(``int` `d ``in` `l)``    ``{``        ``int` `divi = 0;``        ` `        ``for``(``int` `j = 0;``                ``j < vec.Count && vec[j] <= d;``                ``j++)``        ``{``            ``if` `(d % vec[j] == 0)``            ``{``                ``divi = 1;``                ``break``;``            ``}``        ``}``        ``if` `(divi == 0)``            ``return` `d;``    ``}``    ``return` `0;``} ` `// Driver code``static` `void` `Main()``{``    ``int` `n = 12;``    ``Console.WriteLine(findLargestDivisor(n));``    ` `    ``n = 97;``    ``Console.WriteLine(findLargestDivisor(n));``}``}` `// This code is contributed by divyesh072019`

## Javascript

 ``

Output:

```6
97```

Time Complexity : O(sqrt(n)*logn)

Auxiliary Space: O(n)

An efficient approach is to divide n by i for every i such that (i * i) divides n.

## C++

 `// Efficient C++ Program to find the``// largest divisor not divisible by any``// perfect square greater than 1``#include ``using` `namespace` `std;`` ` `// Function to find the largest``// divisor not divisible by any``// perfect square greater than 1``int` `findLargestDivisor(``int` `n)``{``    ``for` `(``int` `i = 2; i < ``sqrt``(n) + 1; i++) {``        ` `        ``// If the number is divisible``        ``// by i*i, then remove one i``        ``while` `(n % (i * i) == 0) {``            ``n = n / i;``        ``}``    ``}``  ` `    ``// Now all squares are removed from n``    ``return` `n;   ``}`` ` `// Driver Code``int` `main()``{``    ``int` `n = 12;``    ``cout << findLargestDivisor(n) << endl;`` ` `    ``n = 97;``    ``cout << findLargestDivisor(n) << endl;``    ``return` `0;``}`

## Java

 `// Efficient Java Program to find the``// largest divisor not divisible by any``// perfect square greater than 1` `public` `class` `GFG``{` `    ``// Function to find the largest``    ``// divisor not divisible by any``    ``// perfect square greater than 1``    ``static` `int` `findLargestDivisor(``int` `n)``    ``{``        ``for` `(``int` `i = ``2``; i < Math.sqrt(n) + ``1``; i++) {``            ` `            ``// If the number is divisible``            ``// by i*i, then remove one i``            ``while` `(n % (i * i) == ``0``) {``                ``n = n / i;``            ``}``        ``}``        ` `        ``// Now all squares are removed from n``        ``return` `n;    ``    ``}``    ` `    ``// Driver Code``    ``public` `static` `void` `main(String args[])``    ``{``        ``int` `n = ``12``;``        ``System.out.println(findLargestDivisor(n)) ;``    ` `        ``n = ``97``;``        ``System.out.println(findLargestDivisor(n)) ;``    ` `    ``}``    ``// This code is contributed``    ``// by Ryuga``}`

## Python3

 `# Efficient Python3 Program to find the``# largest divisor not divisible by any``# perfect square greater than 1``import` `math` `# Function to find the largest``# divisor not divisible by any``# perfect square greater than 1``def` `findLargestDivisor( n):` `    ``for` `i ``in` `range` `(``2``, ``int``(math.sqrt(n)) ``+` `1``) :``        ` `        ``# If the number is divisible``        ``# by i*i, then remove one i``        ``while` `(n ``%` `(i ``*` `i) ``=``=` `0``) :``            ``n ``=` `n ``/``/` `i``    ` `    ``# Now all squares are removed from n``    ``return` `n` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:` `    ``n ``=` `12``    ``print` `(findLargestDivisor(n))` `    ``n ``=` `97``    ``print` `(findLargestDivisor(n))` `# This code is contributed by ita_c`

## C#

 `// Efficient C# Program to find the``// largest divisor not divisible by any``// perfect square greater than 1``using` `System;``public` `class` `GFG``{` `    ``// Function to find the largest``    ``// divisor not divisible by any``    ``// perfect square greater than 1``    ``static` `int` `findLargestDivisor(``int` `n)``    ``{``        ``for` `(``int` `i = 2; i < Math.Sqrt(n) + 1; i++) {``            ` `            ``// If the number is divisible``            ``// by i*i, then remove one i``            ``while` `(n % (i * i) == 0) {``                ``n = n / i;``            ``}``        ``}``        ` `        ``// Now all squares are removed from n``        ``return` `n;    ``    ``}``    ` `    ``// Driver Code``    ``public` `static` `void` `Main()``    ``{``        ``int` `n = 12;``        ``Console.WriteLine(findLargestDivisor(n)) ;``    ` `        ``n = 97;``        ``Console.WriteLine(findLargestDivisor(n)) ;``    ` `    ``}``}``    ``// This code is contributed``    ``// by Mukul Singh`

## PHP

 ``

## Javascript

 ``

Output:

```6
97```

Time Complexity : O(sqrt(n))

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up