Open in App
Not now

Legendre’s formula (Given p and n, find the largest x such that p^x divides n!)

• Difficulty Level : Medium
• Last Updated : 05 Nov, 2021

Given an integer n and a prime number p, find the largest x such that px (p raised to power x) divides n! (factorial)
Examples:

```Input:  n = 7, p = 3
Output: x = 2
32 divides 7! and 2 is the largest such power of 3.

Input:  n = 10, p = 3
Output: x = 4
34 divides 10! and 4 is the largest such power of 3.```

n! is multiplication of {1, 2, 3, 4, …n}.
How many numbers in {1, 2, 3, 4, ….. n} are divisible by p?
Every p’th number is divisible by p in {1, 2, 3, 4, ….. n}. Therefore in n!, there are âŒŠn/pâŒ‹ numbers divisible by p. So we know that the value of x (largest power of p that divides n!) is at-least âŒŠn/pâŒ‹.
Can x be larger than âŒŠn/pâŒ‹ ?
Yes, there may be numbers which are divisible by p2, p3, …
How many numbers in {1, 2, 3, 4, ….. n} are divisible by p2, p3, …?
There are âŒŠn/(p2)âŒ‹ numbers divisible by p2 (Every p2‘th number would be divisible). Similarly, there are âŒŠn/(p3)âŒ‹ numbers divisible by p3 and so on.
What is the largest possible value of x?
So the largest possible power is âŒŠn/pâŒ‹ + âŒŠn/(p2)âŒ‹ + âŒŠn/(p3)âŒ‹ + ……
Note that we add only âŒŠn/(p2)âŒ‹ only once (not twice) as one p is already considered by expression âŒŠn/pâŒ‹. Similarly, we consider âŒŠn/(p3)âŒ‹ (not thrice).
Below is implementation of above idea.

C++

 `// C++ program to find largest x such that p*x divides n! ` `#include ` `using` `namespace` `std; `   `// Returns largest power of p that divides n! ` `int` `largestPower(``int` `n, ``int` `p) ` `{ ` `    ``// Initialize result ` `    ``int` `x = 0; `   `    ``// Calculate x = n/p + n/(p^2) + n/(p^3) + .... ` `    ``while` `(n) ` `    ``{ ` `        ``n /= p; ` `        ``x += n; ` `    ``} ` `    ``return` `x; ` `} `   `// Driver code ` `int` `main() ` `{ ` `    ``int` `n = 10, p = 3; ` `    ``cout << ``"The largest power of "``<< p <<` `            ``" that divides "` `<< n << ``"! is "``<< ` `            ``largestPower(n, p) << endl; ` `    ``return` `0; ` `} `   `// This code is contributed by shubhamsingh10`

C

 `// C program to find largest x such that p*x divides n!` `#include `   `// Returns largest power of p that divides n!` `int` `largestPower(``int` `n, ``int` `p)` `{` `    ``// Initialize result` `    ``int` `x = 0;`   `    ``// Calculate x = n/p + n/(p^2) + n/(p^3) + ....` `    ``while` `(n)` `    ``{` `        ``n /= p;` `        ``x += n;` `    ``}` `    ``return` `x;` `}`   `// Driver program` `int` `main()` `{` `    ``int` `n = 10, p = 3;` `    ``printf``(``"The largest power of %d that divides %d! is %d\n"``,` `           ``p, n, largestPower(n, p));` `    ``return` `0;` `}`

Java

 `// Java program to find largest x such that p*x divides n!` `import` `java.io.*;`   `class` `GFG ` `{` `    ``// Function that returns largest power of p ` `    ``// that divides n!` `    ``static` `int` `Largestpower(``int` `n, ``int` `p)` `    ``{` `        ``// Initialize result` `        ``int` `ans = ``0``;`   `        ``// Calculate x = n/p + n/(p^2) + n/(p^3) + ....` `        ``while` `(n > ``0``)` `        ``{` `            ``n /= p;` `            ``ans += n;` `        ``}` `        ``return` `ans;` `    ``}`   `    ``// Driver program` `    ``public` `static` `void` `main (String[] args) ` `    ``{` `        ``int` `n = ``10``;` `        ``int` `p = ``3``;` `        ``System.out.println(``" The largest power of "` `+ p + ``" that divides "` `                ``+ n + ``"! is "` `+ Largestpower(n, p));` `        `  `        `  `    ``}` `}`

Python3

 `# Python3 program to find largest` `# x such that p*x divides n!`   `# Returns largest power of p that divides n!` `def` `largestPower(n, p):` `    `  `    ``# Initialize result` `    ``x ``=` `0`   `    ``# Calculate x = n/p + n/(p^2) + n/(p^3) + ....` `    ``while` `n:` `        ``n ``/``=` `p` `        ``x ``+``=` `n` `    ``return` `x`   `# Driver program` `n ``=` `10``; p ``=` `3` `print` `(``"The largest power of %d that divides %d! is %d\n"``%` `                                ``(p, n, largestPower(n, p)))` `        `  `# This code is contributed by Shreyanshi Arun.`

C#

 `// C# program to find largest x ` `// such that p * x divides n!` `using` `System;`   `public` `class` `GFG ` `{` `    `  `    ``// Function that returns largest  ` `    ``// power of p that divides n!` `    ``static` `int` `Largestpower(``int` `n, ``int` `p)` `    ``{` `        ``// Initialize result` `        ``int` `ans = 0;`   `        ``// Calculate x = n / p + n / (p ^ 2) +` `        ``// n / (p ^ 3) + ....` `        ``while` `(n > 0)` `        ``{` `            ``n /= p;` `            ``ans += n;` `        ``}` `        ``return` `ans;` `    ``}`   `    ``// Driver Code` `    ``public` `static` `void` `Main () ` `    ``{` `        ``int` `n = 10;` `        ``int` `p = 3;` `        ``Console.Write(``" The largest power of "` `+ p + ``" that divides "` `                ``+ n + ``"! is "` `+ Largestpower(n, p));` `        `  `        `  `    ``}` `}`   `// This code is contributed by Sam007`

PHP

 ``

Javascript

 ``

Output:

`The largest power of 3 that divides 10! is 4`

Time complexity: O(logpn)

Auxiliary Space: O(1)
What to do if p is not prime?
We can find all prime factors of p and compute result for every prime factor. Refer Largest power of k in n! (factorial) where k may not be prime for details.
Source:
http://e-maxx.ru/algo/factorial_divisors