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.
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 <bits/stdc++.h> 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<Integer> []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<Integer>(); // 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 |
Javascript
<script> // Javascript program to answer queries // for N-th prime factor of a number const N = 1000001; // 2-D vector that stores prime factors let v = new Array(); for (let i = 0; i < N; i++) { v.push( new Array()) } // Function to pre-store prime // factors of all numbers till 10^6 function preprocess() { // calculate unique prime factors for // every number till 10^6 for (let i = 1; i < N; i++) { let num = i; // find prime factors for (let j = 2; j <= Math.sqrt(num); j++) { if (num % j == 0) { // store if prime factor v[i].push(j); while (num % j == 0) { num = num / j; } } } if (num > 2) v[i].push(num); } } // Function that returns answer // for every query function query(number, n) { return v[number][n - 1]; } // Driver Code // Function to pre-store unique prime factors preprocess(); // 1st query let number = 6, n = 1; document.write(query(number, n) + "<br>" ); // 2nd query number = 210, n = 3; document.write(query(number, n) + "<br>" ); // 3rd query number = 210, n = 2; document.write(query(number, n) + "<br>" ); // 4th query number = 60, n = 2; document.write(query(number, n) + "<br>" ); // This code is contributed gfgking </script> |
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