Count Divisors of n in O(n^1/3)
Last Updated :
13 Dec, 2023
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
Approach 1:
A Naï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++
#include <bits/stdc++.h>
using namespace std;
int countDivisors( int n)
{
int cnt = 0;
for ( int i = 1; i <= sqrt (n); i++) {
if (n % i == 0) {
if (n / i == i)
cnt++;
else
cnt = cnt + 2;
}
}
return cnt;
}
int main()
{
cout << "Total distinct divisors of 100 are " << countDivisors(100));
return 0;
}
|
Java
import java.io.*;
import java.math.*;
class GFG {
static int countDivisors( int n)
{
int cnt = 0 ;
for ( int i = 1 ; i <= Math.sqrt(n); i++)
{
if (n % i == 0 ) {
if (n / i == i)
cnt++;
else
cnt = cnt + 2 ;
}
}
return cnt;
}
public static void main(String args[])
{
System.out.println( "Total distinct "
+ "divisors of 100 are : "
+ countDivisors( 100 ));
}
}
|
Python3
import math
def countDivisors(n) :
cnt = 0
for i in range ( 1 , ( int )(math.sqrt(n)) + 1 ) :
if (n % i = = 0 ) :
if (n / i = = i) :
cnt = cnt + 1
else :
cnt = cnt + 2
return cnt
print ( "Total distinct divisors of 100 are : " ,
countDivisors( 100 ))
|
C#
using System;
class GFG {
static int countDivisors( int n)
{
int cnt = 0;
for ( int i = 1; i <= Math.Sqrt(n);
i++)
{
if (n % i == 0) {
if (n / i == i)
cnt++;
else
cnt = cnt + 2;
}
}
return cnt;
}
public static void Main()
{
Console.WriteLine( "Total distinct"
+ " divisors of 100 are : "
+ countDivisors(100));
}
}
|
PHP
<?php
function countDivisors( $n )
{
$cnt = 0;
for ( $i = 1; $i <= sqrt( $n ); $i ++)
{
if ( $n % $i == 0)
{
if ( $n / $i == $i )
$cnt ++;
else
$cnt = $cnt + 2;
}
}
return $cnt ;
}
echo "Total distinct divisors of 100 are : " ,
countDivisors(100);
?>
|
Javascript
<script>
function countDivisors(n)
{
let cnt = 0;
for (let i = 1; i <= Math.sqrt(n); i++)
{
if (n % i == 0) {
if (n / i == i)
cnt++;
else
cnt = cnt + 2;
}
}
return cnt;
}
document.write( "Total distinct "
+ "divisors of 100 are : "
+ countDivisors(100));
</script>
|
Output :
Total distinct divisors of 100 are : 9
Time Complexity : (O(n^1/2))
Space Complexity: O(1)
Approach 2:
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, 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++
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes( int n, bool prime[],
bool primesquare[], int a[])
{
for ( int i = 2; i <= n; i++)
prime[i] = true ;
for ( int i = 0; i <= (n * n + 1); i++)
primesquare[i] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
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]) {
a[j] = p;
primesquare[p * p] = true ;
j++;
}
}
}
int countDivisors( int n)
{
if (n == 1)
return 1;
bool prime[n + 1], primesquare[n * n + 1];
int a[n];
SieveOfEratosthenes(n, prime, primesquare, a);
int ans = 1;
for ( int i = 0;; i++) {
if (a[i] * a[i] * a[i] > n)
break ;
int cnt = 1;
while (n % a[i] == 0)
{
n = n / a[i];
cnt = cnt + 1;
}
ans = ans * cnt;
}
if (prime[n])
ans = ans * 2;
else if (primesquare[n])
ans = ans * 3;
else if (n != 1)
ans = ans * 4;
return ans;
}
int main()
{
cout << "Total distinct divisors of 100 are : "
<< countDivisors(100) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static void SieveOfEratosthenes( int n, boolean prime[],
boolean primesquare[], int a[])
{
for ( int i = 2 ; i <= n; i++)
prime[i] = true ;
for ( int i = 0 ; i < ((n * n) + 1 ); i++)
primesquare[i] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= n; p++) {
if (prime[p] == true ) {
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]) {
a[j] = p;
primesquare[p * p] = true ;
j++;
}
}
}
static int countDivisors( int n)
{
if (n == 1 )
return 1 ;
boolean prime[] = new boolean [n + 1 ];
boolean primesquare[] = new boolean [(n * n) + 1 ];
int a[] = new int [n];
SieveOfEratosthenes(n, prime, primesquare, a);
int ans = 1 ;
for ( int i = 0 ;; i++) {
if (a[i] * a[i] * a[i] > n)
break ;
int cnt = 1 ;
while (n % a[i] == 0 ) {
n = n / a[i];
cnt = cnt + 1 ;
}
ans = ans * cnt;
}
if (prime[n])
ans = ans * 2 ;
else if (primesquare[n])
ans = ans * 3 ;
else if (n != 1 )
ans = ans * 4 ;
return ans;
}
public static void main(String args[])
{
System.out.println( "Total distinct divisors"
+ " of 100 are : " + countDivisors( 100 ));
}
}
|
Python3
def SieveOfEratosthenes(n, prime,primesquare, a):
for i in range ( 2 ,n + 1 ):
prime[i] = True
for i in range ((n * n + 1 ) + 1 ):
primesquare[i] = False
prime[ 1 ] = False
p = 2
while (p * p < = n):
if (prime[p] = = True ):
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 ):
a[j] = p
primesquare[p * p] = True
j + = 1
def countDivisors(n):
if (n = = 1 ):
return 1
prime = [ False ] * (n + 2 )
primesquare = [ False ] * (n * n + 2 )
a = [ 0 ] * n
SieveOfEratosthenes(n, prime, primesquare, a)
ans = 1
i = 0
while ( 1 ):
if (a[i] * a[i] * a[i] > n):
break
cnt = 1
while (n % a[i] = = 0 ):
n = n / a[i]
cnt = cnt + 1
ans = ans * cnt
i + = 1
n = int (n)
if (prime[n] = = True ):
ans = ans * 2
else if (primesquare[n] = = True ):
ans = ans * 3
else if (n ! = 1 ):
ans = ans * 4
return ans
if __name__ = = '__main__' :
print ( "Total distinct divisors of 100 are :" ,countDivisors( 100 ))
|
C#
using System;
class GFG {
static void SieveOfEratosthenes( int n, bool [] prime,
bool [] primesquare, int [] a)
{
for ( int i = 2; i <= n; i++)
prime[i] = true ;
for ( int i = 0; i < ((n * n) + 1); i++)
primesquare[i] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
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]) {
a[j] = p;
primesquare[p * p] = true ;
j++;
}
}
}
static int countDivisors( int n)
{
if (n == 1)
return 1;
bool [] prime = new bool [n + 1];
bool [] primesquare = new bool [(n * n) + 1];
int [] a = new int [n];
SieveOfEratosthenes(n, prime, primesquare, a);
int ans = 1;
for ( int i = 0;; i++) {
if (a[i] * a[i] * a[i] > n)
break ;
int cnt = 1;
while (n % a[i] == 0) {
n = n / a[i];
cnt = cnt + 1;
}
ans = ans * cnt;
}
if (prime[n])
ans = ans * 2;
else if (primesquare[n])
ans = ans * 3;
else if (n != 1)
ans = ans * 4;
return ans;
}
public static void Main()
{
Console.Write( "Total distinct divisors"
+ " of 100 are : " + countDivisors(100));
}
}
|
PHP
<?php
function SieveOfEratosthenes( $n , & $prime ,
& $primesquare , & $a )
{
for ( $i = 2; $i <= $n ; $i ++)
$prime [ $i ] = true;
for ( $i = 0; $i <= ( $n * $n + 1); $i ++)
$primesquare [ $i ] = false;
$prime [1] = false;
for ( $p = 2; $p * $p <= $n ; $p ++)
{
if ( $prime [ $p ] == true)
{
for ( $i = $p * 2;
$i <= $n ; $i += $p )
$prime [ $i ] = false;
}
}
$j = 0;
for ( $p = 2; $p <= $n ; $p ++)
{
if ( $prime [ $p ])
{
$a [ $j ] = $p ;
$primesquare [ $p * $p ] = true;
$j ++;
}
}
}
function countDivisors( $n )
{
if ( $n == 1)
return 1;
$prime = array_fill (false, $n + 1, NULL);
$primesquare = array_fill (false,
$n * $n + 1, NULL);
$a = array_fill (0, $n , NULL);
SieveOfEratosthenes( $n , $prime ,
$primesquare , $a );
$ans = 1;
for ( $i = 0;; $i ++)
{
if ( $a [ $i ] * $a [ $i ] * $a [ $i ] > $n )
break ;
$cnt = 1;
while ( $n % $a [ $i ] == 0)
{
$n = $n / $a [ $i ];
$cnt = $cnt + 1;
}
$ans = $ans * $cnt ;
}
if ( $prime [ $n ])
$ans = $ans * 2;
else if ( $primesquare [ $n ])
$ans = $ans * 3;
else if ( $n != 1)
$ans = $ans * 4;
return $ans ;
}
echo "Total distinct divisors of 100 are : " .
countDivisors(100). "\n" ;
?>
|
Javascript
<script>
function SieveOfEratosthenes(n, prime, primesquare, a)
{
for (let i = 2; i <= n; i++)
prime[i] = true ;
for (let i = 0; i < ((n * n) + 1); i++)
primesquare[i] = false ;
prime[1] = false ;
for (let p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
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])
{
a[j] = p;
primesquare[p * p] = true ;
j++;
}
}
}
function countDivisors(n)
{
if (n == 1)
return 1;
let prime = new Array(n + 1);
let primesquare = new Array((n * n) + 1);
let a = new Array(n);
for (let i = 0; i < n; i++)
{
a[i] = 0;
}
SieveOfEratosthenes(n, prime, primesquare, a);
let ans = 1;
for (let i = 0;; i++)
{
if (a[i] * a[i] * a[i] > n)
break ;
let cnt = 1;
while (n % a[i] == 0)
{
n = n / a[i];
cnt = cnt + 1;
}
ans = ans * cnt;
}
if (prime[n])
ans = ans * 2;
else if (primesquare[n])
ans = ans * 3;
else if (n != 1)
ans = ans * 4;
return ans;
}
document.write( "Total distinct divisors" +
" of 100 are : " + countDivisors(100));
</script>
|
Output :
Total distinct divisors of 100 are : 9
Time Complexity: O(n1/3)
Space Complexity: O(n)
Share your thoughts in the comments
Please Login to comment...