📜  k在n中的最大幂! (阶乘)其中k可能不是素数

📅  最后修改于: 2021-04-26 09:53:28             🧑  作者: Mango

给定两个数字k和n,找出除以n的k的最大幂!
限制条件:

K > 1

例子:

Input : n = 7, k = 2
Output : 4
Explanation : 7! = 5040
The largest power of 2 that
divides 5040 is 24.

Input : n = 10, k = 9
Output :  2
The largest power of 9 that
divides 10! is 92.

当k总是素数时,我们在下面的文章中讨论了一种解决方案。
勒让德勒的公式(给出p和n,找到最大的x,以使p ^ x除以n!)
现在,要找到n!中任何非素数k的幂,我们首先找到数k的所有素数以及它们出现的次数。然后,对于每个素数,我们使用勒让德式公式对出现次数进行计数,该公式指出n中素数p的最大可能乘方为⌊n/p⌋+⌊n/(p 2 )⌋+⌊n/(p 3 )⌋ +……
在K的所有素数p上,findPowerOfK(n,p)/ count的最小值为最小值的那个将是我们的答案,其中count是p在k中出现的次数。

C++
// CPP program to find the largest power
// of k that divides n!
#include 
using namespace std;
 
// To find the power of a prime p in
// factorial N
int findPowerOfP(int n, int p)
{
    int count = 0;
    int r=p;
    while (r <= n) {
 
        // calculating floor(n/r)
        // and adding to the count
        count += (n / r);
 
        // increasing the power of p
        // from 1 to 2 to 3 and so on
        r = r * p;
    }
    return count;
}
 
// returns all the prime factors of k
vector > primeFactorsofK(int k)
{
    // vector to store all the prime factors
    // along with their number of occurrence
    // in factorization of k
    vector > ans;
 
    for (int i = 2; k != 1; i++) {
        if (k % i == 0) {
            int count = 0;
            while (k % i == 0) {
                k = k / i;
                count++;
            }
 
            ans.push_back(make_pair(i, count));
        }
    }
    return ans;
}
 
// Returns largest power of k that
// divides n!
int largestPowerOfK(int n, int k)
{
    vector > vec;
    vec = primeFactorsofK(k);
    int ans = INT_MAX;
    for (int i = 0; i < vec.size(); i++)
 
        // calculating minimum power of all
        // the prime factors of k
        ans = min(ans, findPowerOfP(n,
              vec[i].first) / vec[i].second);
 
    return ans;
}
 
// Driver code
int main()
{
    cout << largestPowerOfK(7, 2) << endl;
    cout << largestPowerOfK(10, 9) << endl;
    return 0;
}


Java
// JAVA program to find the largest power
// of k that divides n!
import java.util.*;
 
class GFG
{
     
static class pair
{
    int first, second;
    public pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
// To find the power of a prime p in
// factorial N
static int findPowerOfP(int n, int p)
{
    int count = 0;
    int r = p;
    while (r <= n)
    {
 
        // calculating Math.floor(n/r)
        // and adding to the count
        count += (n / r);
 
        // increasing the power of p
        // from 1 to 2 to 3 and so on
        r = r * p;
    }
    return count;
}
 
// returns all the prime factors of k
static Vector primeFactorsofK(int k)
{
    // vector to store all the prime factors
    // along with their number of occurrence
    // in factorization of k
    Vector ans = new Vector();
 
    for (int i = 2; k != 1; i++)
    {
        if (k % i == 0)
        {
            int count = 0;
            while (k % i == 0)
            {
                k = k / i;
                count++;
            }
 
            ans.add(new pair(i, count));
        }
    }
    return ans;
}
 
// Returns largest power of k that
// divides n!
static int largestPowerOfK(int n, int k)
{
    Vector vec = new Vector();
    vec = primeFactorsofK(k);
    int ans = Integer.MAX_VALUE;
    for (int i = 0; i < vec.size(); i++)
 
        // calculating minimum power of all
        // the prime factors of k
        ans = Math.min(ans, findPowerOfP(n,
            vec.get(i).first) / vec.get(i).second);
 
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    System.out.print(largestPowerOfK(7, 2) +"\n");
    System.out.print(largestPowerOfK(10, 9) +"\n");
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python3 program to find the largest power
# of k that divides n!
import sys
 
# To find the power of a prime p in
# factorial N
def findPowerOfP(n, p) :
 
    count = 0
    r = p
    while (r <= n) :
 
        # calculating floor(n/r)
        # and adding to the count
        count += (n // r)
 
        # increasing the power of p
        # from 1 to 2 to 3 and so on
        r = r * p
      
    return count
 
# returns all the prime factors of k
def primeFactorsofK(k) :
 
    # vector to store all the prime factors
    # along with their number of occurrence
    # in factorization of k
    ans = []
    i = 2
    while k != 1 :
        if k % i == 0 :
            count = 0
            while k % i == 0 :
                k = k // i
                count += 1
            ans.append([i , count])
        i += 1
 
    return ans
 
# Returns largest power of k that
# divides n!
def largestPowerOfK(n, k) :
 
    vec = primeFactorsofK(k)
    ans = sys.maxsize
    for i in range(len(vec)) :
 
        # calculating minimum power of all
        # the prime factors of k
        ans = min(ans, findPowerOfP(n, vec[i][0]) // vec[i][1])
 
    return ans
 
print(largestPowerOfK(7, 2))
print(largestPowerOfK(10, 9))
 
# This code is contributed by divyesh072019


C#
// C# program to find the largest power
// of k that divides n!
using System;
using System.Collections.Generic;
 
class GFG
{
     
class pair
{
    public int first, second;
    public pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
 
// To find the power of a prime p in
// factorial N
static int findPowerOfP(int n, int p)
{
    int count = 0;
    int r = p;
    while (r <= n)
    {
 
        // calculating Math.Floor(n/r)
        // and adding to the count
        count += (n / r);
 
        // increasing the power of p
        // from 1 to 2 to 3 and so on
        r = r * p;
    }
    return count;
}
 
// returns all the prime factors of k
static List primeFactorsofK(int k)
{
    // vector to store all the prime factors
    // along with their number of occurrence
    // in factorization of k
    List ans = new List();
 
    for (int i = 2; k != 1; i++)
    {
        if (k % i == 0)
        {
            int count = 0;
            while (k % i == 0)
            {
                k = k / i;
                count++;
            }
 
            ans.Add(new pair(i, count));
        }
    }
    return ans;
}
 
// Returns largest power of k that
// divides n!
static int largestPowerOfK(int n, int k)
{
    List vec = new List();
    vec = primeFactorsofK(k);
    int ans = int.MaxValue;
    for (int i = 0; i < vec.Count; i++)
 
        // calculating minimum power of all
        // the prime factors of k
        ans = Math.Min(ans, findPowerOfP(n,
            vec[i].first) / vec[i].second);
 
    return ans;
}
 
// Driver code
public static void Main(String[] args)
{
    Console.Write(largestPowerOfK(7, 2) +"\n");
    Console.Write(largestPowerOfK(10, 9) +"\n");
}
}
 
// This code is contributed by 29AjayKumar


输出:

4
2