Largest integer upto N having greatest prime factor greater than its square root

• Difficulty Level : Medium
• Last Updated : 31 Oct, 2021

Given a positive integer N, the task is to find the largest number in the range [1, N] such that the square root of the number is less than its greatest prime factor.

Input: N = 15
Output: 15
Explanation: The prime factors of 15 are {3, 5}. The square root of 15 is 3.87 (i.e, 3.87 < 5). Therefore 15 is the largest valid integer in the given range.

Input: N = 25
Output: 23

Approach: The given problem can be solved by using the Sieve of Eratosthenes with a few modifications. Create an array gpf[], which stores the Greatest Prime Factor of all integers in the given range. Initially, gpf[] = {0}. Using Sieve, initialize all the indices of the array gpf[] with the greatest prime factor of the respective index similar to the algorithm discussed in this article.

Now, iterate over the range [N, 1] in a reverse manner and print the first integer whose square root of the number is less than its greatest prime factor.

Below is the implementation of the above approach:

C++

 `// C++ program for the above approach`   `#include ` `using` `namespace` `std;`   `const` `int` `maxn = 100001;`   `// Stores the Greatest Prime Factor` `int` `gpf[maxn];`   `// Modified Sieve to find the Greatest` `// Prime Factor of all integers in the` `// range [1, maxn]` `void` `modifiedSieve()` `{` `    ``// Initialize the array with 0` `    ``memset``(gpf, 0, ``sizeof``(gpf));` `    ``gpf[0] = 0;` `    ``gpf[1] = 1;`   `    ``// Iterate through all values of i` `    ``for` `(``int` `i = 2; i < maxn; i++) {`   `        ``// If i is not a prime number` `        ``if` `(gpf[i] > 0)` `            ``continue``;`   `        ``// Update the multiples of i` `        ``for` `(``int` `j = i; j < maxn; j += i) {` `            ``gpf[j] = max(i, gpf[j]);` `        ``}` `    ``}` `}`   `// Function to find integer in the range` `// [1, N] such that its Greatest Prime` `// factor is greater than its square root` `int` `greatestValidInt(``int` `N)` `{`   `    ``modifiedSieve();`   `    ``// Iterate through all values of` `    ``// i in the range [N, 1]` `    ``for` `(``int` `i = N; i > 0; i--) {`   `        ``// If greatest prime factor of i` `        ``// is greater than its square root` `        ``if` `(gpf[i] > ``sqrt``(i)) {`   `            ``// Return answer` `            ``return` `i;` `        ``}` `    ``}`   `    ``// If no valid integer exist` `    ``return` `-1;` `}`   `// Driver Code` `int` `main()` `{` `    ``int` `N = 25;` `    ``cout << greatestValidInt(N);`   `    ``return` `0;` `}`

Java

 `// Java program for the above approach` `public` `class` `GFG {` `    `  `    ``final` `static` `int` `maxn = ``100001``;` `    `  `    ``// Stores the Greatest Prime Factor` `    ``static` `int` `gpf[] = ``new` `int``[maxn];` `    `  `    ``// Modified Sieve to find the Greatest` `    ``// Prime Factor of all integers in the` `    ``// range [1, maxn]` `    ``static` `void` `modifiedSieve()` `    ``{` `      `  `        ``// Initialize the array with 0` `        ``for` `(``int` `i = ``0``; i < maxn; i++ )` `            ``gpf[i] = ``0``;` `            `  `        ``gpf[``0``] = ``0``;` `        ``gpf[``1``] = ``1``;` `    `  `        ``// Iterate through all values of i` `        ``for` `(``int` `i = ``2``; i < maxn; i++) {` `    `  `            ``// If i is not a prime number` `            ``if` `(gpf[i] > ``0``)` `                ``continue``;` `    `  `            ``// Update the multiples of i` `            ``for` `(``int` `j = i; j < maxn; j += i) {` `                ``gpf[j] = Math.max(i, gpf[j]);` `            ``}` `        ``}` `    ``}` `    `  `    ``// Function to find integer in the range` `    ``// [1, N] such that its Greatest Prime` `    ``// factor is greater than its square root` `    ``static` `int` `greatestValidInt(``int` `N)` `    ``{` `    `  `        ``modifiedSieve();` `    `  `        ``// Iterate through all values of` `        ``// i in the range [N, 1]` `        ``for` `(``int` `i = N; i > ``0``; i--) {` `    `  `            ``// If greatest prime factor of i` `            ``// is greater than its square root` `            ``if` `(gpf[i] > Math.sqrt(i)) {` `    `  `                ``// Return answer` `                ``return` `i;` `            ``}` `        ``}` `    `  `        ``// If no valid integer exist` `        ``return` `-``1``;` `    ``}` `    `  `    ``// Driver Code` `    ``public` `static` `void` `main (String[] args)` `    ``{` `        ``int` `N = ``25``;` `        ``System.out.println(greatestValidInt(N));` `    ``} ` `}`   `// This code is contributed by AnkThon`

Python3

 `# python program for the above approach`   `import` `math`   `maxn ``=` `100001`   `# Stores the Greatest Prime Factor` `gpf ``=` `[``0` `for` `_ ``in` `range``(maxn)]`   `# Modified Sieve to find the Greatest` `# Prime Factor of all integers in the` `# range [1, maxn]`     `def` `modifiedSieve():`   `    ``# Initialize the array with 0` `    ``gpf[``0``] ``=` `0` `    ``gpf[``1``] ``=` `1`   `    ``# Iterate through all values of i` `    ``for` `i ``in` `range``(``2``, maxn):`   `        ``# If i is not a prime number` `        ``if` `(gpf[i] > ``0``):` `            ``continue`   `        ``# Update the multiples of i` `        ``for` `j ``in` `range``(i, maxn, i):` `            ``gpf[j] ``=` `max``(i, gpf[j])`     `# Function to find integer in the range` `# [1, N] such that its Greatest Prime` `# factor is greater than its square root` `def` `greatestValidInt(N):`   `    ``modifiedSieve()`   `    ``# Iterate through all values of` `    ``# i in the range [N, 1]` `    ``for` `i ``in` `range``(N, ``0``, ``-``1``):`   `        ``# If greatest prime factor of i` `        ``# is greater than its square root` `        ``if` `(gpf[i] > math.sqrt(i)):`   `            ``# Return answer` `            ``return` `i`   `    ``# If no valid integer exist` `    ``return` `-``1`     `# Driver Code` `if` `__name__ ``=``=` `"__main__"``:`   `    ``N ``=` `25` `    ``print``(greatestValidInt(N))`   `# This code is contributed by rakeshsahni`

C#

 `// C# program for the above approach` `using` `System;` `public` `class` `GFG {`   `    ``static` `int` `maxn = 100001;`   `    ``// Stores the Greatest Prime Factor` `    ``static` `int``[] gpf = ``new` `int``[maxn];`   `    ``// Modified Sieve to find the Greatest` `    ``// Prime Factor of all integers in the` `    ``// range [1, maxn]` `    ``static` `void` `modifiedSieve()` `    ``{`   `        ``// Initialize the array with 0` `        ``for` `(``int` `i = 0; i < maxn; i++)` `            ``gpf[i] = 0;`   `        ``gpf[0] = 0;` `        ``gpf[1] = 1;`   `        ``// Iterate through all values of i` `        ``for` `(``int` `i = 2; i < maxn; i++) {`   `            ``// If i is not a prime number` `            ``if` `(gpf[i] > 0)` `                ``continue``;`   `            ``// Update the multiples of i` `            ``for` `(``int` `j = i; j < maxn; j += i) {` `                ``gpf[j] = Math.Max(i, gpf[j]);` `            ``}` `        ``}` `    ``}`   `    ``// Function to find integer in the range` `    ``// [1, N] such that its Greatest Prime` `    ``// factor is greater than its square root` `    ``static` `int` `greatestValidInt(``int` `N)` `    ``{`   `        ``modifiedSieve();`   `        ``// Iterate through all values of` `        ``// i in the range [N, 1]` `        ``for` `(``int` `i = N; i > 0; i--) {`   `            ``// If greatest prime factor of i` `            ``// is greater than its square root` `            ``if` `(gpf[i] > Math.Sqrt(i)) {`   `                ``// Return answer` `                ``return` `i;` `            ``}` `        ``}`   `        ``// If no valid integer exist` `        ``return` `-1;` `    ``}`   `    ``// Driver Code` `    ``public` `static` `void` `Main(``string``[] args)` `    ``{` `        ``int` `N = 25;` `        ``Console.WriteLine(greatestValidInt(N));` `    ``}` `}`   `// This code is contributed by ukasp.`

Javascript

 ``

Output:

`23`

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

My Personal Notes arrow_drop_up
Recommended Articles
Page :