# N-th prime factor of a given number

Given Q queries which consist of two integers, one is number(1 <= number <= 106) and the other is N., the task is to find the N-th prime factor of the given number.

Examples:

Input: Number of Queries, Q = 4
number = 6, N = 1
number = 210, N = 3
number = 210, N = 2
number = 60, N = 2

Output:
2
5
3
3

6 has prime factors 2 and 3.
210 has prime factors 2, 3 and 6.
60 has prime factors 2 and 3.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

A naive approach is to factorize every number and store the prime factors. Print the N-th prime factors thus stored.
Time Complexity: O(log(n)) per query.

An efficient approach is to pre-calculate all the prime factors of the number and store the numbers in a sorted order in a 2-D vector. Since the number will not be more than 106, the number of unique prime factors will be around 7-8 at max(because of 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 >= 106). Once the numbers are stored, the query can be answered in O(1) as the n-1th index will have the answer in numberth row.

Below is the implementation of the above approach:

## CPP

 `// C++ program to answer queries ` `// for N-th prime factor of a number ` `#include ` `using` `namespace` `std; ` `const` `int` `N = 1000001; ` ` `  `// 2-D vector that stores prime factors ` `vector<``int``> v[N]; ` ` `  `// Function to pre-store prime ` `// factors of all numbers till 10^6 ` `void` `preprocess() ` `{ ` `    ``// calculate unique prime factors for ` `    ``// every number till 10^6 ` `    ``for` `(``int` `i = 1; i < N; i++) { ` ` `  `        ``int` `num = i; ` ` `  `        ``// find prime factors ` `        ``for` `(``int` `j = 2; j <= ``sqrt``(num); j++) { ` `            ``if` `(num % j == 0) { ` ` `  `                ``// store if prime factor ` `                ``v[i].push_back(j); ` ` `  `                ``while` `(num % j == 0) { ` `                    ``num = num / j; ` `                ``} ` `            ``} ` `        ``} ` `         `  `        ``if``(num>2) ` `        ``v[i].push_back(num); ` `         `  `    ``} ` `} ` ` `  `// Function that returns answer ` `// for every query ` `int` `query(``int` `number, ``int` `n) ` `{ ` `    ``return` `v[number][n - 1]; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` ` `  `    ``// Function to pre-store unique prime factors ` `    ``preprocess(); ` ` `  `    ``// 1st query ` `    ``int` `number = 6, n = 1; ` `    ``cout << query(number, n) << endl; ` ` `  `    ``// 2nd query ` `    ``number = 210, n = 3; ` `    ``cout << query(number, n) << endl; ` ` `  `    ``// 3rd query ` `    ``number = 210, n = 2; ` `    ``cout << query(number, n) << endl; ` ` `  `    ``// 4th query ` `    ``number = 60, n = 2; ` `    ``cout << query(number, n) << endl; ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to answer queries ` `// for N-th prime factor of a number ` `import` `java.util.*; ` ` `  `class` `GFG ` `{ ` `     `  `static` `int` `N = ``1000001``; ` ` `  `// 2-D vector that stores prime factors ` `static` `Vector []v = ``new` `Vector[N]; ` ` `  `// Function to pre-store prime ` `// factors of all numbers till 10^6 ` `static` `void` `preprocess() ` `{ ` `    ``// calculate unique prime factors for ` `    ``// every number till 10^6 ` `    ``for` `(``int` `i = ``1``; i < N; i++)  ` `    ``{ ` ` `  `        ``int` `num = i; ` ` `  `        ``// find prime factors ` `        ``for` `(``int` `j = ``2``; j <= Math.sqrt(num); j++)  ` `        ``{ ` `            ``if` `(num % j == ``0``) ` `            ``{ ` ` `  `                ``// store if prime factor ` `                ``v[i].add(j); ` ` `  `                ``while` `(num % j == ``0``)  ` `                ``{ ` `                    ``num = num / j; ` `                ``} ` `            ``} ` `        ``} ` `        ``if``(num > ``2``) ` `        ``v[i].add(num); ` `    ``} ` `} ` ` `  `// Function that returns answer ` `// for every query ` `static` `int` `query(``int` `number, ``int` `n) ` `{ ` `    ``return` `v[number].get(n - ``1``); ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` ` `  `    ``for` `(``int` `i = ``0``; i < N; i++) ` `        ``v[i] = ``new` `Vector(); ` ` `  `    ``// Function to pre-store unique prime factors ` `    ``preprocess(); ` ` `  `    ``// 1st query ` `    ``int` `number = ``6``, n = ``1``; ` `    ``System.out.print(query(number, n) +``"\n"``); ` ` `  `    ``// 2nd query ` `    ``number = ``210``; n = ``3``; ` `    ``System.out.print(query(number, n) +``"\n"``); ` ` `  `    ``// 3rd query ` `    ``number = ``210``; n = ``2``; ` `    ``System.out.print(query(number, n) +``"\n"``); ` ` `  `    ``// 4th query ` `    ``number = ``60``; n = ``2``; ` `    ``System.out.print(query(number, n) +``"\n"``); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

## Python3

 `# Python3 program to answer queries ` `# for N-th prime factor of a number ` `from` `math ``import` `sqrt,ceil ` `N ``=` `10001` ` `  `# 2-D vector that stores prime factors ` `v ``=` `[[] ``for` `i ``in` `range``(N)] ` ` `  `# Function to pre-store prime ` `# factors of all numbers till 10^6 ` `def` `preprocess(): ` `     `  `    ``# calculate unique prime factors for ` `    ``# every number till 10^6 ` `    ``for` `i ``in` `range``(``1``, N): ` ` `  `        ``num ``=` `i ` ` `  `        ``# find prime factors ` `        ``for` `j ``in` `range``(``2``,ceil(sqrt(num)) ``+` `1``): ` `            ``if` `(num ``%` `j ``=``=` `0``): ` `                 `  `                ``# store if prime factor ` `                ``v[i].append(j) ` ` `  `                ``while` `(num ``%` `j ``=``=` `0``): ` `                    ``num ``=` `num ``/``/` `j ` ` `  `        ``if``(num > ``2``): ` `            ``v[i].append(num) ` ` `  `# Function that returns answer ` `# for every query ` `def` `query(number, n): ` `    ``return` `v[number][n ``-` `1``] ` ` `  `# Driver Code ` ` `  `# Function to pre-store unique prime factors ` `preprocess() ` ` `  `# 1st query ` `number ``=` `6` `n ``=` `1` `print``(query(number, n)) ` ` `  `# 2nd query ` `number ``=` `210` `n ``=` `3` `print``(query(number, n)) ` ` `  `# 3rd query ` `number ``=` `210` `n ``=` `2` `print``(query(number, n)) ` ` `  `# 4th query ` `number ``=` `60` `n ``=` `2` `print``(query(number, n)) ` ` `  `# This code is contributed by mohit kumar 29 `

## C#

 `// C# program to answer queries ` `// for N-th prime factor of a number ` `using` `System; ` `using` `System.Collections.Generic; ` ` `  `class` `GFG ` `{ ` `     `  `static` `int` `N = 100001; ` ` `  `// 2-D vector that stores prime factors ` `static` `List<``int``> []v = ``new` `List<``int``>[N]; ` ` `  `// Function to pre-store prime ` `// factors of all numbers till 10^6 ` `static` `void` `preprocess() ` `{ ` `    ``// calculate unique prime factors for ` `    ``// every number till 10^6 ` `    ``for` `(``int` `i = 1; i < N; i++)  ` `    ``{ ` ` `  `        ``int` `num = i; ` ` `  `        ``// find prime factors ` `        ``for` `(``int` `j = 2; j <= Math.Sqrt(num); j++)  ` `        ``{ ` `            ``if` `(num % j == 0) ` `            ``{ ` ` `  `                ``// store if prime factor ` `                ``v[i].Add(j); ` ` `  `                ``while` `(num % j == 0)  ` `                ``{ ` `                    ``num = num / j; ` `                ``} ` `            ``} ` `        ``} ` `        ``if``(num > 2) ` `        ``v[i].Add(num); ` `    ``} ` `} ` ` `  `// Function that returns answer ` `// for every query ` `static` `int` `query(``int` `number, ``int` `n) ` `{ ` `    ``return` `v[number][n - 1]; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` ` `  `    ``for` `(``int` `i = 0; i < N; i++) ` `        ``v[i] = ``new` `List<``int``>(); ` ` `  `    ``// Function to pre-store unique prime factors ` `    ``preprocess(); ` ` `  `    ``// 1st query ` `    ``int` `number = 6, n = 1; ` `    ``Console.Write(query(number, n) +``"\n"``); ` ` `  `    ``// 2nd query ` `    ``number = 210; n = 3; ` `    ``Console.Write(query(number, n) +``"\n"``); ` ` `  `    ``// 3rd query ` `    ``number = 210; n = 2;  ` `    ``Console.Write(query(number, n) +``"\n"``); ` ` `  `    ``// 4th query ` `    ``number = 60; n = 2; ` `    ``Console.Write(query(number, n) +``"\n"``); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

Output:

```2
5
3
3
```

Time Complexity: O(1) per query and O(maxN * log(maxN)) for pre-processing, where maxN = 106.

Auxiliary Space: O(N * 8) in worst case

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.