📜  求x的最大值,使n! %(k ^ x)= 0

📅  最后修改于: 2021-04-29 06:09:45             🧑  作者: Mango

给定两个整数nk 。任务是找到x的最大值,例如n! %(k ^ x)= 0

例子

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

方法

  1. 首先取平方根k并将其存储在变量中, m
  2. 从i = 2到m运行循环。
  3. 如果i = m,则将k复制到i。
  4. 如果k被i整除,则将k除以i。
  5. 对n运行一个循环,然后将商添加到一个变量中,例如, u
  6. 在每个循环后存储r的最小值。

下面是上述方法的实现:

C++
// C++ program to maximize the value 
// of x such that n! % (k^x) = 0 
#include
#include
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<


Java
// 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));
    }
}


Python 3
# 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 = n 
  
    # 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


C#
// 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)); 
    } 
}


PHP
 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
?>


输出:
3