Dados dos enteros positivos B y N. ¡La tarea es encontrar el número de ceros finales en la representación b-aria (base B) de N! (factorial de N)
Ejemplos:
Input: N = 5, B = 2 Output: 3 5! = 120 which is represented as 1111000 in base 2. Input: N = 6, B = 9 Output: 1
Una solución ingenua es encontrar el factorial del número dado y convertirlo en la base B dada. Luego, cuente el número de ceros finales, pero eso sería una operación costosa. Además, no será fácil encontrar el factorial de números grandes y almacenarlo en enteros.
Enfoque eficiente: supongamos que la base es 10, es decir, decimal, ¡entonces tendremos que calcular la potencia más alta de 10 que divide a N! utilizando la fórmula de Legendre . Por lo tanto, el número B se representa como 10 cuando se convierte en base B. Digamos que la base B = 13, entonces 13 en base 13 se representará como 10, es decir, 13 10 = 10 13 . Por lo tanto, el problema se reduce a encontrar la potencia más alta de B en N!. ( ¡Mayor potencia de k en n! )
A continuación se muestra la implementación del enfoque anterior.
C++
// CPP program to find the number of trailing // zeroes in base B representation of N! #include <bits/stdc++.h> 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<pair<int, int> > primeFactorsofB(int B) { // vector to store all the prime factors // along with their number of occurrence // in factorization of B vector<pair<int, int> > ans; for (int i = 2; B != 1; i++) { if (B % i == 0) { int count = 0; while (B % i == 0) { B = B / i; count++; } ans.push_back(make_pair(i, count)); } } return ans; } // Returns largest power of B that // divides N! int largestPowerOfB(int N, int B) { vector<pair<int, int> > vec; vec = primeFactorsofB(B); int ans = INT_MAX; for (int i = 0; i < vec.size(); i++) // calculating minimum power of all // the prime factors of B ans = min(ans, findPowerOfP(N, vec[i].first) / vec[i].second); return ans; } // Driver code int main() { cout << largestPowerOfB(5, 2) << endl; cout << largestPowerOfB(6, 9) << endl; return 0; }
Java
// Java program to find the number of trailing // zeroes in base B representation of 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 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<pair> primeFactorsofB(int B) { // vector to store all the prime factors // along with their number of occurrence // in factorization of B Vector<pair> ans = new Vector<pair>(); for (int i = 2; B != 1; i++) { if (B % i == 0) { int count = 0; while (B % i == 0) { B = B / i; count++; } ans.add(new pair(i, count)); } } return ans; } // Returns largest power of B that // divides N! static int largestPowerOfB(int N, int B) { Vector<pair> vec = new Vector<pair>(); vec = primeFactorsofB(B); int ans = Integer.MAX_VALUE; for (int i = 0; i < vec.size(); i++) // calculating minimum power of all // the prime factors of B 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.println(largestPowerOfB(5, 2)); System.out.println(largestPowerOfB(6, 9)); } } // This code is contributed by Princi Singh
Python3
# Python 3 program to find the number of # trailing zeroes in base B representation of 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 += int(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 primeFactorsofB(B): # vector to store all the prime factors # along with their number of occurrence # in factorization of B' ans = [] i = 2 while(B!= 1): if (B % i == 0): count = 0 while (B % i == 0): B = int(B / i) count += 1 ans.append((i, count)) i += 1 return ans # Returns largest power of B that # divides N! def largestPowerOfB(N, B): vec = [] vec = primeFactorsofB(B) ans = sys.maxsize # calculating minimum power of all # the prime factors of B ans = min(ans, int(findPowerOfP(N, vec[0][0]) / vec[0][1])) return ans # Driver code if __name__ == '__main__': print(largestPowerOfB(5, 2)) print(largestPowerOfB(6, 9)) # This code is contributed by # Surendra_Gangwar
C#
// C# program to find the number of trailing // zeroes in base B representation of N! using System; using System.Collections.Generic; class GFG { public 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 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<pair> primeFactorsofB(int B) { // vector to store all the prime factors // along with their number of occurrence // in factorization of B List<pair> ans = new List<pair>(); for (int i = 2; B != 1; i++) { if (B % i == 0) { int count = 0; while (B % i == 0) { B = B / i; count++; } ans.Add(new pair(i, count)); } } return ans; } // Returns largest power of B that // divides N! static int largestPowerOfB(int N, int B) { List<pair> vec = new List<pair>(); vec = primeFactorsofB(B); int ans = int.MaxValue; for (int i = 0; i < vec.Count; i++) // calculating minimum power of all // the prime factors of B ans = Math.Min(ans, findPowerOfP( N, vec[i].first) / vec[i].second); return ans; } // Driver code public static void Main(String[] args) { Console.WriteLine(largestPowerOfB(5, 2)); Console.WriteLine(largestPowerOfB(6, 9)); } } // This code is contributed by 29AjayKumar
Javascript
<script> // JavaScript program to find the number of trailing // zeroes in base B representation of N! // To find the power of a prime p in // factorial N function findPowerOfP(N, p) { var count = 0; var 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 function primeFactorsofB(B) { // vector to store all the prime factors // along with their number of occurrence // in factorization of B var ans = []; for (var i = 2; B != 1; i++) { if (B % i == 0) { var count = 0; while (B % i == 0) { B = B / i; count++; } ans.push([i, count]); } } return ans; } // Returns largest power of B that // divides N! function largestPowerOfB(N, B) { var vec =[]; vec = primeFactorsofB(B); var ans = Number.MAX_VALUE; for (var i = 0; i < vec.length; i++) // calculating minimum power of all // the prime factors of B ans = Math.min(ans, Math.floor(findPowerOfP(N, vec[i][0]) / vec[i][1])); return ans; } // Driver code document.write(largestPowerOfB(5, 2) + "<br>"); document.write(largestPowerOfB(6, 9) + "<br>"); // This code is contributed by ShubhamSingh10 </script>
3 1
Publicación traducida automáticamente
Artículo escrito por Nishant Tanwar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA