Count Divisors of n in O(n^1/3) - GeeksforGeeks

10 Mar, 2022
Given a number n, count all distinct divisors of it.
Examples: 
Input : 18
Output : 6
Divisors of 18 are 1, 2, 3, 6, 9 and 18.

Input : 100
Output : 9
Divisors of 100 are 1, 2, 4, 5, 10, 20,
25, 50 and 100
A Naïve Solution would be to iterate all the numbers from 1 to sqrt(n), checking if that number divides n and incrementing number of divisors. This approach takes O(sqrt(n)) time. 
C++
Java
Python3
C#
PHP
Javascript
// C implementation of Naive method to count all// divisors#include <bits/stdc++.h>using namespace std; // function to count the divisorsint countDivisors(int n){    int cnt = 0;    for (int i = 1; i <= sqrt(n); i++) {        if (n % i == 0) {            // If divisors are equal,            // count only one            if (n / i == i)                cnt++;             else // Otherwise count both                cnt = cnt + 2;        }    }    return cnt;} /* Driver program to test above function */int main(){    printf("Total distinct divisors of 100 are : %d",           countDivisors(100));    return 0;}
// JAVA implementation of Naive method// to count all divisorsimport java.io.*;import java.math.*; class GFG {     // function to count the divisors    static int countDivisors(int n)    {        int cnt = 0;        for (int i = 1; i <= Math.sqrt(n); i++)        {            if (n % i == 0) {                // If divisors are equal,                // count only one                if (n / i == i)                    cnt++;                 else // Otherwise count both                    cnt = cnt + 2;            }        }        return cnt;    }     /* Driver program to test above function */    public static void main(String args[])    {        System.out.println("Total distinct "                  + "divisors of 100 are : "                        + countDivisors(100));    }} /*This code is contributed by Nikita Tiwari.*/
# Python3 implementation of Naive method# to count all divisors import math # function to count the divisorsdef countDivisors(n) :    cnt = 0    for i in range(1, (int)(math.sqrt(n)) + 1) :        if (n % i == 0) :                         # If divisors are equal,            # count only one            if (n / i == i) :                cnt = cnt + 1            else : # Otherwise count both                cnt = cnt + 2                     return cnt     # Driver program to test above function */ print("Total distinct divisors of 100 are : ",      countDivisors(100)) # This code is contributed by Nikita Tiwari.
// C# implementation of Naive method// to count all divisorsusing System; class GFG {     // function to count the divisors    static int countDivisors(int n)    {        int cnt = 0;        for (int i = 1; i <= Math.Sqrt(n);                                      i++)        {            if (n % i == 0) {                                 // If divisors are equal,                // count only one                if (n / i == i)                    cnt++;                 // Otherwise count both                else                    cnt = cnt + 2;            }        }                 return cnt;    }     // Driver program    public static void Main()    {        Console.WriteLine("Total distinct"               + " divisors of 100 are : "                    + countDivisors(100));    }} // This code is contributed by anuj_67.
<?php// PHP implementation of Naive// method to count all divisors // function to count the divisors function countDivisors($n){    $cnt = 0;    for ($i = 1; $i <= sqrt($n); $i++)    {        if ($n % $i == 0)        {            // If divisors are equal,            // count only one            if ($n / $i == $i)            $cnt++;             // Otherwise count both            else                $cnt = $cnt + 2;        }    }    return $cnt;} // Driver Codeecho "Total distinct divisors of 100 are : ",        countDivisors(100); // This code is contributed by Ajit?>
<script> // JavaScript program for the above approach     // function to count the divisors    function countDivisors(n)    {        let cnt = 0;        for (let i = 1; i <= Math.sqrt(n); i++)        {            if (n % i == 0) {                // If divisors are equal,                // count only one                if (n / i == i)                    cnt++;                 else // Otherwise count both                    cnt = cnt + 2;            }        }        return cnt;    } // Driver Code         document.write("Total distinct "                  + "divisors of 100 are : "                        + countDivisors(100));             // This code is contributed by susmitakundugoaldanga.           </script>
Output : 
Total distinct divisors of 100 are : 9
Optimized Solution (O(n^1/3)) 
For a number N, we try to find a number X ≤ ∛N i.e.  X^3 ≤ N such that it divides the number, and another number Y such that N = X * Y. X consists of all the prime factor of N, which are less than  ∛N and Y contains all the prime factors that are greater. Thus, they have no common factor and their HCF is 1.
We iterate through the numbers 1 to ∛N, and for all primes, we check if the number divides N.  
If the prime is divisible, we divide it as many times as we can from the number N, so that, that specific prime factor no longer remains. We keep doing this for all prime factors less than ∛N. Therefore, the number remaining after the loop won’t have any prime factors less than ∛N.
For N = p1e1 *p2e2*p3e3... where p1, p2, p3.. are the prime factors, the number of divisors is given by (e1+1) * (e2+1) * (e3+1) ...
The for loop gives us the product of (e+1) for each prime factor less than ∛N.
The remaining number can only have a maximum of 2 prime factors. We’ll prove this by contradiction.
Assume Y = p1 * p2 * p3 where p1,p2,p3 are prime and p1,p2,p3 > ∛N [Explained above].
Since p1 >∛N and p2 > ∛N and p3 > ∛N
p1*p2*p3 > ∛N*∛N*∛N
=> p1*p2*p3 > N. But Y is a factor of N and cannot be greater than N.
Therefore, there is a contradiction, which implies that one of p1, p2, p3 must be less than ∛N.
But since all primes less than ∛N have been absorbed by X, this is not possible.
So, Y cannot have more than 2 prime factors.
Y can therefore have:
1 prime factors if it is prime (Y) with exponent 1
1 prime factors if it is a square of a prime (sqrt(Y)), with exponent 2
2 prime factors if composite (p1, p2) with exponent 1 and 1
Therefore, we multiply:
If Y is prime => (exponent of y .i.e. 1 +1) = 2
If Y is a square of prime => (exponent of sqrt(y) .i.e. 2+1) = 3
If Y is composite => (exponent of p1 +1)*(exponent of p2+1) = 2 * 2 = 4
C++
Java
Python3
C#
PHP
Javascript
// C++ program to count distinct divisors// of a given number n#include <bits/stdc++.h>using namespace std; void SieveOfEratosthenes(int n, bool prime[],                         bool primesquare[], int a[]){         //For more details check out: https://www.geeksforgeeks.org/sieve-of-eratosthenes/         // Create a boolean array "prime[0..n]" and    // initialize all entries it as true. A value    // in prime[i] will finally be false if i is    // Not a prime, else true.    for (int i = 2; i <= n; i++)        prime[i] = true;     // Create a boolean array "primesquare[0..n*n+1]"    // and initialize all entries it as false. A value    // in squareprime[i] will finally be true if i is    // square of prime, else false.    for (int i = 0; i <= (n * n + 1); i++)        primesquare[i] = false;     // 1 is not a prime number    prime[1] = false;     for (int p = 2; p * p <= n; p++) {        // If prime[p] is not changed, then        // it is a prime        if (prime[p] == true) {            // Update all multiples of p starting from p * p            for (int i = p * p; i <= n; i += p)                prime[i] = false;        }    }     int j = 0;    for (int p = 2; p <= n; p++) {        if (prime[p]) {            // Storing primes in an array            a[j] = p;             // Update value in primesquare[p*p],            // if p is prime.            primesquare[p * p] = true;            j++;        }    }} // Function to count divisorsint countDivisors(int n){    // If number is 1, then it will have only 1    // as a factor. So, total factors will be 1.    if (n == 1)        return 1;     bool prime[n + 1], primesquare[n * n + 1];     int a[n]; // for storing primes upto n     // Calling SieveOfEratosthenes to store prime    // factors of n and to store square of prime    // factors of n    SieveOfEratosthenes(n, prime, primesquare, a);     // ans will contain total number of distinct    // divisors    int ans = 1;     // Loop for counting factors of n    for (int i = 0;; i++) {        // a[i] is not less than cube root n        if (a[i] * a[i] * a[i] > n)            break;         // Calculating power of a[i] in n.        int cnt = 1; // cnt is power of prime a[i] in n.        while (n % a[i] == 0) // if a[i] is a factor of n        {            n = n / a[i];            cnt = cnt + 1; // incrementing power        }         // Calculating the number of divisors        // If n = a^p * b^q then total divisors of n        // are (p+1)*(q+1)        ans = ans * cnt;    }     // if a[i] is greater than cube root of n     // First case    if (prime[n])        ans = ans * 2;     // Second case    else if (primesquare[n])        ans = ans * 3;     // Third case    else if (n != 1)        ans = ans * 4;     return ans; // Total divisors} // Driver Programint main(){    cout << "Total distinct divisors of 100 are : "         << countDivisors(100) << endl;    return 0;}
// JAVA program to count distinct// divisors of a given number nimport java.io.*; class GFG {     static void SieveOfEratosthenes(int n, boolean prime[],                                    boolean primesquare[], int a[])    {        // Create a boolean array "prime[0..n]" and        // initialize all entries it as true. A value        // in prime[i] will finally be false if i is        // Not a prime, else true.        for (int i = 2; i <= n; i++)            prime[i] = true;         /* Create a boolean array "primesquare[0..n*n+1]"         and initialize all entries it as false.         A value in squareprime[i] will finally         be true if i is square of prime,         else false.*/        for (int i = 0; i < ((n * n) + 1); i++)            primesquare[i] = false;         // 1 is not a prime number        prime[1] = false;         for (int p = 2; p * p <= n; p++) {            // If prime[p] is not changed,            // then it is a prime            if (prime[p] == true) {                // Update all multiples of p                for (int i = p * 2; i <= n; i += p)                    prime[i] = false;            }        }         int j = 0;        for (int p = 2; p <= n; p++) {            if (prime[p]) {                // Storing primes in an array                a[j] = p;                 // Update value in                // primesquare[p*p],                // if p is prime.                primesquare[p * p] = true;                j++;            }        }    }     // Function to count divisors    static int countDivisors(int n)    {        // If number is 1, then it will        // have only 1 as a factor. So,        // total factors will be 1.        if (n == 1)            return 1;         boolean prime[] = new boolean[n + 1];        boolean primesquare[] = new boolean[(n * n) + 1];         // for storing primes upto n        int a[] = new int[n];         // Calling SieveOfEratosthenes to        // store prime factors of n and to        // store square of prime factors of n        SieveOfEratosthenes(n, prime, primesquare, a);         // ans will contain total number        // of distinct divisors        int ans = 1;         // Loop for counting factors of n        for (int i = 0;; i++) {            // a[i] is not less than cube root n            if (a[i] * a[i] * a[i] > n)                break;             // Calculating power of a[i] in n.            // cnt is power of prime a[i] in n.            int cnt = 1;             // if a[i] is a factor of n            while (n % a[i] == 0) {                n = n / a[i];                 // incrementing power                cnt = cnt + 1;            }             // Calculating the number of divisors            // If n = a^p * b^q then total            // divisors of n are (p+1)*(q+1)            ans = ans * cnt;        }         // if a[i] is greater than cube root        // of n         // First case        if (prime[n])            ans = ans * 2;         // Second case        else if (primesquare[n])            ans = ans * 3;         // Third case        else if (n != 1)            ans = ans * 4;         return ans; // Total divisors    }     // Driver Program    public static void main(String args[])    {        System.out.println("Total distinct divisors"                           + " of 100 are : " + countDivisors(100));    }} /*This code is contributed by Nikita Tiwari*/
# Python3 program to count distinct# divisors of a given number n def SieveOfEratosthenes(n, prime,primesquare, a):    # Create a boolean array "prime[0..n]"    # and initialize all entries it as    # true. A value in prime[i] will finally    # be false if i is not a prime, else true.    for i in range(2,n+1):        prime[i] = True     # Create a boolean array "primesquare[0..n*n+1]"    # and initialize all entries it as false.    # A value in squareprime[i] will finally be    # true if i is square of prime, else false.    for i in range((n * n + 1)+1):        primesquare[i] = False     # 1 is not a prime number    prime[1] = False     p = 2    while(p * p <= n):        # If prime[p] is not changed,        # then it is a prime        if (prime[p] == True):            # Update all multiples of p            i = p * 2            while(i <= n):                prime[i] = False                i += p        p+=1          j = 0    for p in range(2,n+1):        if (prime[p]==True):            # Storing primes in an array            a[j] = p             # Update value in primesquare[p*p],            # if p is prime.            primesquare[p * p] = True            j+=1 # Function to count divisorsdef countDivisors(n):    # If number is 1, then it will    # have only 1 as a factor. So,    # total factors will be 1.    if (n == 1):        return 1     prime = [False]*(n + 2)    primesquare = [False]*(n * n + 2)         # for storing primes upto n    a = [0]*n     # Calling SieveOfEratosthenes to    # store prime factors of n and to    # store square of prime factors of n    SieveOfEratosthenes(n, prime, primesquare, a)     # ans will contain total    # number of distinct divisors    ans = 1     # Loop for counting factors of n    i=0    while(1):        # a[i] is not less than cube root n        if(a[i] * a[i] * a[i] > n):            break         # Calculating power of a[i] in n.        cnt = 1 # cnt is power of                # prime a[i] in n.        while (n % a[i] == 0): # if a[i] is a factor of n            n = n / a[i]            cnt = cnt + 1 # incrementing power         # Calculating number of divisors        # If n = a^p * b^q then total        # divisors of n are (p+1)*(q+1)        ans = ans * cnt        i+=1     # if a[i] is greater than    # cube root of n         n=int(n)    # First case    if (prime[n]==True):        ans = ans * 2     # Second case    else if (primesquare[n]==True):        ans = ans * 3     # Third case    else if (n != 1):        ans = ans * 4     return ans # Total divisors # Driver Codeif __name__=='__main__':    print("Total distinct divisors of 100 are :",countDivisors(100)) # This code is contributed# by mits
// C# program to count distinct// divisors of a given number nusing System; class GFG {     static void SieveOfEratosthenes(int n, bool[] prime,                                    bool[] primesquare, int[] a)    {         // Create a boolean array "prime[0..n]" and        // initialize all entries it as true. A value        // in prime[i] will finally be false if i is        // Not a prime, else true.        for (int i = 2; i <= n; i++)            prime[i] = true;         /* Create a boolean array "primesquare[0..n*n+1]"        and initialize all entries it as false.        A value in squareprime[i] will finally        be true if i is square of prime,        else false.*/        for (int i = 0; i < ((n * n) + 1); i++)            primesquare[i] = false;         // 1 is not a prime number        prime[1] = false;         for (int p = 2; p * p <= n; p++) {             // If prime[p] is not changed,            // then it is a prime            if (prime[p] == true) {                 // Update all multiples of p                for (int i = p * 2; i <= n; i += p)                    prime[i] = false;            }        }         int j = 0;        for (int p = 2; p <= n; p++) {            if (prime[p]) {                 // Storing primes in an array                a[j] = p;                 // Update value in                // primesquare[p*p],                // if p is prime.                primesquare[p * p] = true;                j++;            }        }    }     // Function to count divisors    static int countDivisors(int n)    {         // If number is 1, then it will        // have only 1 as a factor. So,        // total factors will be 1.        if (n == 1)            return 1;         bool[] prime = new bool[n + 1];        bool[] primesquare = new bool[(n * n) + 1];         // for storing primes upto n        int[] a = new int[n];         // Calling SieveOfEratosthenes to        // store prime factors of n and to        // store square of prime factors of n        SieveOfEratosthenes(n, prime, primesquare, a);         // ans will contain total number        // of distinct divisors        int ans = 1;         // Loop for counting factors of n        for (int i = 0;; i++) {             // a[i] is not less than cube root n            if (a[i] * a[i] * a[i] > n)                break;             // Calculating power of a[i] in n.            // cnt is power of prime a[i] in n.            int cnt = 1;             // if a[i] is a factor of n            while (n % a[i] == 0) {                n = n / a[i];                 // incrementing power                cnt = cnt + 1;            }             // Calculating the number of divisors            // If n = a^p * b^q then total            // divisors of n are (p+1)*(q+1)            ans = ans * cnt;        }         // if a[i] is greater than cube root        // of n         // First case        if (prime[n])            ans = ans * 2;         // Second case        else if (primesquare[n])            ans = ans * 3;         // Third case        else if (n != 1)            ans = ans * 4;         return ans; // Total divisors    }     // Driver Program    public static void Main()    {        Console.Write("Total distinct divisors"                      + " of 100 are : " + countDivisors(100));    }} // This code is contributed by parashar.
<?php// PHP program to count distinct// divisors of a given number n function SieveOfEratosthenes($n, &$prime,                             &$primesquare, &$a){    // Create a boolean array "prime[0..n]"    // and initialize all entries it as    // true. A value in prime[i] will finally    // be false if i is not a prime, else true.    for ($i = 2; $i <= $n; $i++)        $prime[$i] = true;     // Create a boolean array "primesquare[0..n*n+1]"    // and initialize all entries it as false.    // A value in squareprime[i] will finally be    // true if i is square of prime, else false.    for ($i = 0; $i <= ($n * $n + 1); $i++)        $primesquare[$i] = false;     // 1 is not a prime number    $prime[1] = false;     for ($p = 2; $p * $p <= $n; $p++)    {        // If prime[p] is not changed,        // then it is a prime        if ($prime[$p] == true)        {            // Update all multiples of p            for ($i = $p * 2;                 $i <= $n; $i += $p)                $prime[$i] = false;        }    }     $j = 0;    for ($p = 2; $p <= $n; $p++)    {        if ($prime[$p])        {            // Storing primes in an array            $a[$j] = $p;             // Update value in primesquare[p*p],            // if p is prime.            $primesquare[$p * $p] = true;            $j++;        }    }} // Function to count divisorsfunction countDivisors($n){    // If number is 1, then it will    // have only 1 as a factor. So,    // total factors will be 1.    if ($n == 1)        return 1;     $prime = array_fill(false, $n + 1, NULL);    $primesquare = array_fill(false,                          $n * $n + 1, NULL);         // for storing primes upto n    $a = array_fill(0, $n, NULL);      // Calling SieveOfEratosthenes to    // store prime factors of n and to    // store square of prime factors of n    SieveOfEratosthenes($n, $prime,                        $primesquare, $a);     // ans will contain total    // number of distinct divisors    $ans = 1;     // Loop for counting factors of n    for ($i = 0;; $i++)    {        // a[i] is not less than cube root n        if ($a[$i] * $a[$i] * $a[$i] > $n)            break;         // Calculating power of a[i] in n.        $cnt = 1; // cnt is power of                  // prime a[i] in n.        while ($n % $a[$i] == 0) // if a[i] is a                                 // factor of n        {            $n = $n / $a[$i];            $cnt = $cnt + 1; // incrementing power        }         // Calculating the number of divisors        // If n = a^p * b^q then total        // divisors of n are (p+1)*(q+1)        $ans = $ans * $cnt;    }     // if a[i] is greater than    // cube root of n     // First case    if ($prime[$n])        $ans = $ans * 2;     // Second case    else if ($primesquare[$n])        $ans = $ans * 3;     // Third case    else if ($n != 1)        $ans = $ans * 4;     return $ans; // Total divisors} // Driver Codeecho "Total distinct divisors of 100 are : ".                    countDivisors(100). "\n"; // This code is contributed// by ChitraNayal?>
<script> // Javascript program to count distinct// divisors of a given number n     function SieveOfEratosthenes(n, prime, primesquare, a){         // Create a boolean array "prime[0..n]" and    // initialize all entries it as true. A value    // in prime[i] will finally be false if i is    // Not a prime, else true.    for(let i = 2; i <= n; i++)        prime[i] = true;             // Create a boolean array "primesquare[0..n*n+1]"    // and initialize all entries it as false.    // A value in squareprime[i] will finally    // be true if i is square of prime,    // else false.    for(let i = 0; i < ((n * n) + 1); i++)        primesquare[i] = false;     // 1 is not a prime number    prime[1] = false;     for(let p = 2; p * p <= n; p++)    {                 // If prime[p] is not changed,        // then it is a prime        if (prime[p] == true)        {                         // Update all multiples of p            for(let i = p * 2; i <= n; i += p)                prime[i] = false;        }    }     let j = 0;    for(let p = 2; p <= n; p++)    {        if (prime[p])        {                         // Storing primes in an array            a[j] = p;             // Update value in            // primesquare[p*p],            // if p is prime.            primesquare[p * p] = true;            j++;        }    }} // Function to count divisorsfunction countDivisors(n){         // If number is 1, then it will    // have only 1 as a factor. So,    // total factors will be 1.    if (n == 1)        return 1;     let prime = new Array(n + 1);    let primesquare = new Array((n * n) + 1);     // For storing primes upto n    let a = new Array(n);    for(let i = 0; i < n; i++)    {        a[i] = 0;    }     // Calling SieveOfEratosthenes to    // store prime factors of n and to    // store square of prime factors of n    SieveOfEratosthenes(n, prime, primesquare, a);     // ans will contain total number    // of distinct divisors    let ans = 1;     // Loop for counting factors of n    for(let i = 0;; i++)    {                 // a[i] is not less than cube root n        if (a[i] * a[i] * a[i] > n)            break;         // Calculating power of a[i] in n.        // cnt is power of prime a[i] in n.        let cnt = 1;         // If a[i] is a factor of n        while (n % a[i] == 0)        {            n = n / a[i];             // Incrementing power            cnt = cnt + 1;        }         // Calculating the number of divisors        // If n = a^p * b^q then total        // divisors of n are (p+1)*(q+1)        ans = ans * cnt;    }     // If a[i] is greater than cube root    // of n     // First case    if (prime[n])        ans = ans * 2;     // Second case    else if (primesquare[n])        ans = ans * 3;     // Third case    else if (n != 1)        ans = ans * 4;             // Total divisors    return ans;} // Driver Codedocument.write("Total distinct divisors" +               " of 100 are : " + countDivisors(100)); // This code is contributed by avanitrachhadiya2155 </script>
Output : 
Total distinct divisors of 100 are : 9
Time Complexity: O(n1/3)
This article is contributed by Karun Anantharaman. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
parashar
jit_t
vt_m
ukasp
Mithun Kumar
Apoorva_Kumar
susmitakundugoaldanga
avanitrachhadiya2155
karun19049
demishassabis
simmytarika5
divisors
Numbers
sieve
Mathematical
Technical Scripter
Mathematical
Numbers
sieve
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Program to find sum of elements in a given array
Program for Decimal to Binary Conversion
Program for factorial of a number
Operators in C / C++
The Knight's tour problem | Backtracking-1
Find minimum number of coins that make a given value
Minimum number of jumps to reach end