Find maximum value of x such that n! % (k^x) = 0

Given two integers n and k. The task is to find the maximum value of x, such that, n! % (k^x) = 0.

Examples:

Input : n = 5, k = 2
Output : 3
Explanation : Given n = 5 and k = 2. So, n! = 120. 
Now for different values of x:
n! % 2^0 = 0,
n! % 2^1 = 0,
n! % 2^2 = 0, 
n! % 2^3 = 0, 
n! % 2^4 = 8, 
n! % 2^5 = 24, 
n! % 2^6 = 56, 
n! % 2^7 = 120. 
So, the answer should be 3.

Input : n = 1000, x = 2
Output : 994

Approach:



  1. First take the squareroot of k and store it in a variable say, m.
  2. Run the loop from i=2 to m.
  3. If i = m then copy k to i.
  4. If k is divisible by i then divide k by i.
  5. Run a loop to n and add the quotient to a variable say, u.
  6. Store the minimum value of r after every loop.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to maximize the value 
// of x such that n! % (k^x) = 0 
#include<iostream>
#include<math.h>
using namespace std;
  
class GfG
  
    // Function to maximize the value 
    // of x such that n! % (k^x) = 0 
    public:
    int findX(int n, int k) 
    
        int r = n, v, u; 
  
        // Find square root of k and add 1 to it 
        int m = sqrt(k) + 1; 
  
        // Run the loop from 2 to m and k 
        // sould be greater than 1 
        for (int i = 2; i <= m && k > 1; i++) { 
            if (i == m) { 
                i = k; 
            
  
            // optimize the value of k 
            for (u = v = 0; k % i == 0; v++) { 
                k /= i; 
            
  
            if (v > 0) { 
                int t = n; 
                while (t > 0) { 
                    t /= i; 
                    u += t; 
                
  
                // Minimum store 
                r = min(r, u / v); 
            
        
  
        return r; 
    
};
  
    // Driver Code 
    int main() 
    {
        GfG g;
        int n = 5; 
        int k = 2; 
        cout<<g.findX(n, k); 
    
  
//This code is contributed by Soumik

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to maximize the value
// of x such that n! % (k^x) = 0
  
import java.util.*;
  
public class GfG {
  
    // Function to maximize the value
    // of x such that n! % (k^x) = 0
    private static int findX(int n, int k)
    {
        int r = n, v, u;
  
        // Find square root of k and add 1 to it
        int m = (int)Math.sqrt(k) + 1;
  
        // Run the loop from 2 to m and k
        // sould be greater than 1
        for (int i = 2; i <= m && k > 1; i++) {
            if (i == m) {
                i = k;
            }
  
            // optimize the value of k
            for (u = v = 0; k % i == 0; v++) {
                k /= i;
            }
  
            if (v > 0) {
                int t = n;
                while (t > 0) {
                    t /= i;
                    u += t;
                }
  
                // Minimum store
                r = Math.min(r, u / v);
            }
        }
  
        return r;
    }
  
    // Driver Code
    public static void main(String args[])
    {
        int n = 5;
        int k = 2;
  
        System.out.println(findX(n, k));
    }
}

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to maximize the value
# of x such that n! % (k^x) = 0
import math
  
# Function to maximize the value
# of x such that n! % (k^x) = 0
def findX(n, k):
    r =
  
    # Find square root of k 
    # and add 1 to it
    m = int(math.sqrt(k)) + 1
      
    # Run the loop from 2 to m 
    # and k sould be greater than 1
    i = 2
    while i <= m and k > 1 :
        if (i == m) :
              
            i = k
              
        # optimize the value of k
        u = 0
        v = 0
        while k % i == 0 :
            k //= i
            v += 1
          
        if (v > 0) :
            t = n
            while (t > 0) :
                t //= i
                u += t
              
            # Minimum store
            r = min(r, u // v)
              
        i += 1
  
    return r
  
# Driver Code
if __name__ == "__main__":
      
    n = 5
    k = 2
  
    print(findX(n, k))
  
# This code is contributed
# by ChitraNayal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to maximize the value 
// of x such that n! % (k^x) = 0 
  
using System;
  
class GfG
  
    // Function to maximize the value 
    // of x such that n! % (k^x) = 0 
    public int findX(int n, int k) 
    
        int r = n, v, u; 
  
        // Find square root of k and add 1 to it 
        int m = (int)Math.Sqrt(k) + 1; 
  
        // Run the loop from 2 to m and k 
        // sould be greater than 1 
        for (int i = 2; i <= m && k > 1; i++) { 
            if (i == m) { 
                i = k; 
            
  
            // optimize the value of k 
            for (u = v = 0; k % i == 0; v++) { 
                k /= i; 
            
  
            if (v > 0) { 
                int t = n; 
                while (t > 0) { 
                    t /= i; 
                    u += t; 
                
  
                // Minimum store 
                r = Math.Min(r, u / v); 
            
        
  
        return r; 
    
}
  
    // Driver Code 
class geek
{
    public static void Main() 
    {
        GfG g = new GfG();
        int n = 5; 
        int k = 2; 
  
        Console.WriteLine(g.findX(n, k)); 
    

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to maximize the value 
// of x such that n! % (k^x) = 0 
  
// Function to maximize the value 
// of x such that n! % (k^x) = 0 
function findX($n, $k
    $r = $n
  
    // Find square root of k and add 1 to it 
    $m = (int)sqrt($k) + 1; 
      
    // Run the loop from 2 to m and k 
    // sould be greater than 1 
    for ($i = 2; $i <= $m && $k > 1; $i++)
    
        if ($i == $m
        
            $i = $k
        
  
        // optimize the value of k 
        for ($u = $v = 0; $k % $i == 0; $v++)
        
            $k = (int)($k / $i); 
        
  
        if ($v > 0) 
        
            $t = $n
            while ($t > 0)
            
                $t = (int)($t / $i); 
                $u = $u + $t
            
  
            // Minimum store 
            $r = min($r, (int)($u / $v)); 
        
    
    return $r
  
  
// Driver Code 
$n = 5; 
$k = 2; 
echo findX($n, $k); 
      
// This code is contributed by
// Archana_kumari
?>

chevron_right


Output:

3


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.