Open in App
Not now

# Sum of divisors of factorial of a number

• Difficulty Level : Medium
• Last Updated : 13 Sep, 2022

Given a number n, we need to calculate the sum of divisors of factorial of the number.

Examples:

```Input : 4
Output : 60
Factorial of 4 is 24. Divisors of 24 are
1 2 3 4 6 8 12 24, sum of these is 60.

Input : 6
Output : 2418```

A Simple Solution is to first compute the factorial of the given number, then count the number divisors of the factorial. This solution is not efficient and may cause overflow due to factorial computation.

Below is the implementation of the above approach:

## C++

 `// C++ program to find sum of proper divisor of ` `// factorial of a number ` `#include ` `using` `namespace` `std;`   `// function to calculate factorial ` `int` `fact(``int` `n)` `{` `    ``if` `(n == 0)` `        ``return` `1;` `    ``return` `n * fact(n - 1);` `}`   `// function to calculate sum of divisor ` `int` `div``(``int` `x)` `{` `    ``int` `ans = 0;` `    ``for` `(``int` `i = 1; i<= x; i++)` `        ``if` `(x % i == 0)` `            ``ans += i;` `    ``return` `ans;` `}`   `// Returns sum of divisors of n! ` `int` `sumFactDiv(``int` `n)` `{` `    ``return` `div``(fact(n));` `}`   `// Driver Code` `int` `main()` `{` `    ``int` `n = 4;` `    ``cout << sumFactDiv(n);` `}`   `// This code is contributed ` `// by Akanksha Rai`

## C

 `// C program to find sum of proper divisor of ` `// factorial of a number ` `#include ` `// function to calculate factorial `   `int` `fact(``int` `n) {` `    ``if` `(n == 0)` `        ``return` `1;` `    ``return` `n * fact(n - 1);` `}`   `// function to calculate sum of divisor `   `int` `div``(``int` `x) {` `    ``int` `ans = 0;` `    ``for` `(``int` `i = 1; i<= x; i++)` `        ``if` `(x % i == 0)` `            ``ans += i;` `    ``return` `ans;` `}`   `// Returns sum of divisors of n! `   `int` `sumFactDiv(``int` `n) {` `    ``return` `div``(fact(n));` `}`   `// driver program `   `int` `main() {` `    ``int` `n = 4;` `    ``printf``(``"%d"``,sumFactDiv(n));` `}`

## Java

 `// Java program to find sum of proper divisor of` `// factorial of a number` `import` `java.io.*;` `import` `java.util.*;`   `public` `class` `Division` `{` `    ``// function to calculate factorial` `    ``static` `int` `fact(``int` `n)` `    ``{` `        ``if` `(n == ``0``)` `            ``return` `1``;` `        ``return` `n*fact(n-``1``);` `    ``}`   `    ``// function to calculate sum of divisor` `    ``static` `int` `div(``int` `x)` `    ``{` `        ``int` `ans = ``0``;` `        ``for` `(``int` `i = ``1``; i<= x; i++)` `            ``if` `(x%i == ``0``)` `                ``ans += i;` `        ``return` `ans;` `    ``}`   `    ``// Returns sum of divisors of n!` `    ``static` `int` `sumFactDiv(``int` `n)` `    ``{` `        ``return` `div(fact(n));` `    ``}`   `    ``// driver program` `    ``public` `static` `void` `main(String args[])` `    ``{` `        ``int` `n = ``4``;` `        ``System.out.println(sumFactDiv(n));` `    ``}` `} `

## Python3

 `# Python 3 program to find sum of proper ` `# divisor of factorial of a number `   `# function to calculate factorial ` `def` `fact(n):` `    `  `    ``if` `(n ``=``=` `0``):` `        ``return` `1` `    ``return` `n ``*` `fact(n ``-` `1``)`   `# function to calculate sum ` `# of divisor ` `def` `div(x):` `    ``ans ``=` `0``;` `    ``for` `i ``in` `range``(``1``, x ``+` `1``):` `        ``if` `(x ``%` `i ``=``=` `0``):` `            ``ans ``+``=` `i` `    ``return` `ans`   `# Returns sum of divisors of n! ` `def` `sumFactDiv(n):` `    ``return` `div(fact(n))`   `# Driver Code` `n ``=` `4` `print``(sumFactDiv(n))`   `# This code is contributed` `# by Rajput-Ji`

## C#

 `// C# program to find sum of proper ` `// divisor of factorial of a number` `using` `System;` `class` `Division {` `    `  `    ``// function to calculate factorial` `    ``static` `int` `fac(``int` `n)` `    ``{` `        ``if` `(n == 0)` `            ``return` `1;` `        ``return` `n * fac(n - 1);` `    ``}`   `    ``// function to calculate` `    ``// sum of divisor` `    ``static` `int` `div(``int` `x)` `    ``{` `        ``int` `ans = 0;` `        ``for` `(``int` `i = 1; i <= x; i++)` `            ``if` `(x % i == 0)` `                ``ans += i;` `        ``return` `ans;` `    ``}`   `    ``// Returns sum of divisors of n!` `    ``static` `int` `sumFactDiv(``int` `n)` `    ``{` `        ``return` `div(fac(n));` `    ``}`   `    ``// Driver Code` `    ``public` `static` `void` `Main()` `    ``{` `        ``int` `n = 4;` `        ``Console.Write(sumFactDiv(n));` `    ``}` `} `   `// This code is contributed by Nitin Mittal.`

## PHP

 ``

## Javascript

 ``

Output :

`60`

Time Complexity: O(n!)

Auxiliary Space: O(1)

An efficient solution is based on Legendreâ€™s formula. Below are the steps.

1. Find all prime numbers less than or equal to n (input number). We can use Sieve Algorithm for this. Let n be 6. All prime numbers less than 6 are {2, 3, 5}.
2. For each prime number, p find the largest power of it that divides n!. We use Legendreâ€™s formula for this purpose.
• The largest power of 2 that divides 6!, exp1 = 4.
• The largest power of 3 that divides 6!, exp2 = 2.
• The largest power of 5 that divides 6!, exp3 = 1.
3. The result is based on the Divisor Function

## C++

 `// C++ program to find sum of divisors in n!` `#include` `#include` `using` `namespace` `std;`   `// allPrimes[] stores all prime numbers less` `// than or equal to n.` `vector<``int``> allPrimes;`   `// Fills above vector allPrimes[] for a given n` `void` `sieve(``int` `n)` `{` `    ``// 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.` `    ``vector<``bool``> prime(n+1, ``true``);`   `    ``// Loop to update prime[]` `    ``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``;` `        ``}` `    ``}`   `    ``// Store primes in the vector allPrimes` `    ``for` `(``int` `p = 2; p <= n; p++)` `        ``if` `(prime[p])` `            ``allPrimes.push_back(p);` `}`   `// Function to find all result of factorial number` `int` `factorialDivisors(``int` `n)` `{` `    ``sieve(n);  ``// create sieve`   `    ``// Initialize result` `    ``int` `result = 1;`   `    ``// find exponents of all primes which divides n` `    ``// and less than n` `    ``for` `(``int` `i = 0; i < allPrimes.size(); i++)` `    ``{` `        ``// Current divisor` `        ``int` `p = allPrimes[i];`   `        ``// Find the highest power (stored in exp)'` `        ``// of allPrimes[i] that divides n using` `        ``// Legendre's formula.` `        ``int` `exp` `= 0;` `        ``while` `(p <= n)` `        ``{` `            ``exp` `= ``exp` `+ (n/p);` `            ``p = p*allPrimes[i];` `        ``}`   `        ``// Using the divisor function to calculate` `        ``// the sum` `        ``result = result*(``pow``(allPrimes[i], ``exp``+1)-1)/` `                                    ``(allPrimes[i]-1);` `    ``}`   `    ``// return total divisors` `    ``return` `result;` `}`   `// Driver program to run the cases` `int` `main()` `{` `    ``cout << factorialDivisors(4);` `    ``return` `0;` `}`

## Java

 `// Java program to find sum of divisors in n! ` `import` `java.util.*;`   `class` `GFG{` `// allPrimes[] stores all prime numbers less ` `// than or equal to n. ` `static` `ArrayList allPrimes=``new` `ArrayList(); `   `// Fills above vector allPrimes[] for a given n ` `static` `void` `sieve(``int` `n) ` `{ ` `    ``// 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. ` `    ``boolean``[] prime=``new` `boolean``[n+``1``]; `   `    ``// Loop to update prime[] ` `    ``for` `(``int` `p = ``2``; p*p <= n; p++) ` `    ``{ ` `        ``// If prime[p] is not changed, then it ` `        ``// is a prime ` `        ``if` `(prime[p] == ``false``) ` `        ``{ ` `            ``// Update all multiples of p ` `            ``for` `(``int` `i = p*``2``; i <= n; i += p) ` `                ``prime[i] = ``true``; ` `        ``} ` `    ``} `   `    ``// Store primes in the vector allPrimes ` `    ``for` `(``int` `p = ``2``; p <= n; p++) ` `        ``if` `(prime[p]==``false``) ` `            ``allPrimes.add(p); ` `} `   `// Function to find all result of factorial number ` `static` `int` `factorialDivisors(``int` `n) ` `{ ` `    ``sieve(n); ``// create sieve `   `    ``// Initialize result ` `    ``int` `result = ``1``; `   `    ``// find exponents of all primes which divides n ` `    ``// and less than n ` `    ``for` `(``int` `i = ``0``; i < allPrimes.size(); i++) ` `    ``{ ` `        ``// Current divisor ` `        ``int` `p = allPrimes.get(i); `   `        ``// Find the highest power (stored in exp)' ` `        ``// of allPrimes[i] that divides n using ` `        ``// Legendre's formula. ` `        ``int` `exp = ``0``; ` `        ``while` `(p <= n) ` `        ``{ ` `            ``exp = exp + (n/p); ` `            ``p = p*allPrimes.get(i); ` `        ``} `   `        ``// Using the divisor function to calculate ` `        ``// the sum ` `        ``result = result*((``int``)Math.pow(allPrimes.get(i), exp+``1``)-``1``)/ ` `                                    ``(allPrimes.get(i)-``1``); ` `    ``} `   `    ``// return total divisors ` `    ``return` `result; ` `} `   `// Driver program to run the cases ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``System.out.println(factorialDivisors(``4``)); ` `} ` `}` `// This code is contributed by mits`

## Python3

 `# Python3 program to find sum of divisors in n! `   `# allPrimes[] stores all prime numbers ` `# less than or equal to n. ` `allPrimes ``=` `[]; `   `# Fills above vector allPrimes[]` `# for a given n ` `def` `sieve(n): `   `    ``# 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. ` `    ``prime ``=` `[``True``] ``*` `(n ``+` `1``); `   `    ``# Loop to update prime[]` `    ``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 ` `            ``for` `i ``in` `range``(p ``*` `2``, n ``+` `1``, p): ` `                ``prime[i] ``=` `False``; ` `        ``p ``+``=` `1``; `   `    ``# Store primes in the vector allPrimes ` `    ``for` `p ``in` `range``(``2``, n ``+` `1``): ` `        ``if` `(prime[p]): ` `            ``allPrimes.append(p); `   `# Function to find all result of factorial number ` `def` `factorialDivisors(n): `   `    ``sieve(n); ``# create sieve `   `    ``# Initialize result ` `    ``result ``=` `1``; `   `    ``# find exponents of all primes which ` `    ``# divides n and less than n ` `    ``for` `i ``in` `range``(``len``(allPrimes)): ` `        `  `        ``# Current divisor ` `        ``p ``=` `allPrimes[i]; `   `        ``# Find the highest power (stored in exp)' ` `        ``# of allPrimes[i] that divides n using ` `        ``# Legendre's formula. ` `        ``exp ``=` `0``; ` `        ``while` `(p <``=` `n):` `            ``exp ``=` `exp ``+` `int``(n ``/` `p); ` `            ``p ``=` `p ``*` `allPrimes[i]; `   `        ``# Using the divisor function to  ` `        ``# calculate the sum ` `        ``result ``=` `int``(result ``*` `(``pow``(allPrimes[i], exp ``+` `1``) ``-` `1``) ``/` `                                           ``(allPrimes[i] ``-` `1``)); `   `    ``# return total divisors ` `    ``return` `result; `   `# Driver Code` `print``(factorialDivisors(``4``));`   `# This code is contributed by mits`

## C#

 `// C# program to find sum of divisors in n! ` `using` `System;` `using` `System.Collections;`   `class` `GFG{` `// allPrimes[] stores all prime numbers less ` `// than or equal to n. ` `static` `ArrayList allPrimes=``new` `ArrayList(); `   `// Fills above vector allPrimes[] for a given n ` `static` `void` `sieve(``int` `n) ` `{ ` `    ``// 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. ` `    ``bool``[] prime=``new` `bool``[n+1]; `   `    ``// Loop to update prime[] ` `    ``for` `(``int` `p = 2; p*p <= n; p++) ` `    ``{ ` `        ``// If prime[p] is not changed, then it ` `        ``// is a prime ` `        ``if` `(prime[p] == ``false``) ` `        ``{ ` `            ``// Update all multiples of p ` `            ``for` `(``int` `i = p*2; i <= n; i += p) ` `                ``prime[i] = ``true``; ` `        ``} ` `    ``} `   `    ``// Store primes in the vector allPrimes ` `    ``for` `(``int` `p = 2; p <= n; p++) ` `        ``if` `(prime[p]==``false``) ` `            ``allPrimes.Add(p); ` `} `   `// Function to find all result of factorial number ` `static` `int` `factorialDivisors(``int` `n) ` `{ ` `    ``sieve(n); ``// create sieve `   `    ``// Initialize result ` `    ``int` `result = 1; `   `    ``// find exponents of all primes which divides n ` `    ``// and less than n ` `    ``for` `(``int` `i = 0; i < allPrimes.Count; i++) ` `    ``{ ` `        ``// Current divisor ` `        ``int` `p = (``int``)allPrimes[i]; `   `        ``// Find the highest power (stored in exp)' ` `        ``// of allPrimes[i] that divides n using ` `        ``// Legendre's formula. ` `        ``int` `exp = 0; ` `        ``while` `(p <= n) ` `        ``{ ` `            ``exp = exp + (n/p); ` `            ``p = p*(``int``)allPrimes[i]; ` `        ``} `   `        ``// Using the divisor function to calculate ` `        ``// the sum ` `        ``result = result*((``int``)Math.Pow((``int``)allPrimes[i], exp+1)-1)/ ` `                                    ``((``int``)allPrimes[i]-1); ` `    ``} `   `    ``// return total divisors ` `    ``return` `result; ` `} `   `// Driver program to run the cases ` `static` `void` `Main() ` `{ ` `    ``Console.WriteLine(factorialDivisors(4)); ` `} ` `}` `// This code is contributed by mits`

## PHP

 ``

## Javascript

 ``

Output:

`60`

Time Complexity: O(n*log(log(n)))

Auxiliary Space: O(n)

This article is contributed by Pramod Kumar. 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.