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++
#include <iostream>
using namespace std;
int largestPower( int n, int p)
{
int x = 0;
while (n)
{
n /= p;
x += n;
}
return x;
}
int main()
{
int n = 10, p = 3;
cout << "The largest power of " << p <<
" that divides " << n << "! is " <<
largestPower(n, p) << endl;
return 0;
}
|
C
#include <stdio.h>
int largestPower( int n, int p)
{
int x = 0;
while (n)
{
n /= p;
x += n;
}
return x;
}
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
import java.io.*;
class GFG
{
static int Largestpower( int n, int p)
{
int ans = 0 ;
while (n > 0 )
{
n /= p;
ans += n;
}
return ans;
}
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
def largestPower(n, p):
x = 0
while n:
n / = p
x + = n
return x
n = 10 ; p = 3
print ( "The largest power of %d that divides %d! is %d\n" %
(p, n, largestPower(n, p)))
|
C#
using System;
public class GFG
{
static int Largestpower( int n, int p)
{
int ans = 0;
while (n > 0)
{
n /= p;
ans += n;
}
return ans;
}
public static void Main ()
{
int n = 10;
int p = 3;
Console.Write( " The largest power of " + p + " that divides "
+ n + "! is " + Largestpower(n, p));
}
}
|
PHP
<?php
function largestPower( $n , $p )
{
$x = 0;
while ( $n )
{
$n = (int) $n / $p ;
$x += $n ;
}
return floor ( $x );
}
$n = 10;
$p = 3;
echo "The largest power of " , $p ;
echo " that divides " , $n , "! is " ;
echo largestPower( $n , $p );
?>
|
Javascript
<script>
function largestPower(n, p)
{
let x = 0;
while (n)
{
n = parseInt(n / p);
x += n;
}
return Math.floor(x);
}
let n = 10;
let p = 3;
document.write( "The largest power of " + p);
document.write( " that divides " + n + "! is " );
document.write(largestPower(n, p));
</script>
|
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
This article is contributed by Ankur. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.