Queries to print all divisors of number

• Difficulty Level : Medium
• Last Updated : 23 Dec, 2017

Given a positive integer ‘n’ and query ‘q’. Print all the divisors of number ‘n’.

Input: 6
Output: 1 2 3 6
Explanation
Divisors of 6 are: 1, 2, 3, 6

Input: 10
Output: 1 2 5 10

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

Naive approach is to iterate through 1 to sqrt(n) for every query ‘q’ and print the divisors accordingly. See this to understand more. Time complexity of this approach is q*sqrt(n) which is not sufficient for large number of queries.

Efficient approach is to use factorization by using sieve base approach.

• Create a list of consecutive integers from 1 to ‘n’.
• For any number ‘d’, iterate through all the multiples of ‘d’ i.e., d, 2d, 3d, … etc. Meanwhile push the divisor ‘d’ for every multiples.
 // C++ program to print divisors of// number for multiple query#include #include using namespace std;  const int MAX = 1e5;  // Initialize global divisor vector// array of sequence containervector divisor[MAX + 1];  // Sieve based approach to pre-// calculate all divisors of numbervoid sieve(){    for (int i = 1; i <= MAX; ++i) {        for (int j = i; j <= MAX; j += i)            divisor[j].push_back(i);    }}  // Utility function to print divisors// of given numberinline void printDivisor(int& n){    for (auto& div : divisor[n])        cout << div << " ";}  // Driver codeint main(){    sieve();      int n = 10;    cout << "Divisors of " << n << " = ";    printDivisor(n);      n = 30;    cout << "\nDivisors of " << n << " = ";    printDivisor(n);    return 0;}
Output
Divisors of 10 = 1 2 5 10
Divisors of 30 = 1 2 3 5 6 10 15 303

Time complexity: O(len) for each query, where len is equal to total divisors of number ‘n’.
Auxiliary space: O(MAX)

My Personal Notes arrow_drop_up