Prerequisite: Print all prime factors and their powers
Given natural numbers N and P, the task is to find the power of P in the factorization of N!.
Examples
Input: N = 4, P = 2
Output: 3
Explanation:
Power of 2 in the prime factorization of 4! = 24 is 3Input: N = 24, P = 4
Output: 11
Naive Approach: The idea is to find the power of P for each number from 1 to N and add them as we know during multiplication power is added.
Time Complexity: O(N*P)
Efficient Approach:
To find the power of the number P in N! do the following:
- Find all the Prime Factors of the number P with their frequency by using the approach discussed in this article. Store the Prime Factors with their frequency in the map.
- Find the power of every Prime Factors of P in the factorization of N! by using the approach discussed in this article.
- Divide every power obtained in the above steps by their corresponding frequency in the map.
- Store the result of the above steps in an array, and a minimum of those elements will give the power of P in the factorization of N!.
Below is the implementation of the above approach:
C++
// C++ program to find the power// of P in N!#include <bits/stdc++.h>using namespace std;// Map to store all the prime// factors of Punordered_map<int, int> Map;// Function to find the prime// factors of N im Mapvoid findPrimeFactors(int N){ int i; // Clear map Map.clear(); // Check for factors of 2 while (N % 2 == 0) { Map[2] += 1; N /= 2; } // Find all the prime factors for (i = 3; i <= sqrt(N); i += 2) { // If i is a factors // then increase the // frequency of i while (N % i == 0) { Map[i] += 1; N /= i; } } if (N > 2) { Map[N] += 1; }}// Function to find the power// of prime number P in N!int PowInFactN(int N, int P){ int ans = 0; int temp = P; // Loop until temp <= N while (temp <= N) { // Add the number of // numbers divisible // by N ans += N / temp; // Each time multiply // temp by P temp = temp * P; } // Returns ans return ans;}// Function that find the// powers of any P in N!int findPowers(int N, int P){ // Find all prime factors // of number P findPrimeFactors(P); // To store the powers of // all prime factors vector<int> Powers; // Traverse the map for (auto& it : Map) { // Prime factor and // corres. powers int primeFac = it.first; int facPow = it.second; // Find power of prime // factor primeFac int p = PowInFactN(N, primeFac); // Divide frequency by // facPow p /= facPow; // Store the power of // primeFac^facPow Powers.push_back(p); } // Return the minimum // element in Power array return *min_element(Powers.begin(), Powers.end());}// Driver's Codeint main(){ int N = 24, P = 4; // Function to find power of // P in N! cout << findPowers(N, P); return 0;} |
Java
// Java program to find the power// of P in N!import java.util.*;class GFG{ // Map to store all the prime// factors of Pstatic HashMap<Integer,Integer> Map = new HashMap<Integer,Integer>(); // Function to find the prime// factors of N im Mapstatic void findPrimeFactors(int N){ int i; // Clear map Map.clear(); // Check for factors of 2 while (N % 2 == 0) { if(Map.containsKey(2)) Map.put(2, Map.get(2) + 1); else Map.put(2, 1); N /= 2; } // Find all the prime factors for (i = 3; i <= Math.sqrt(N); i += 2) { // If i is a factors // then increase the // frequency of i while (N % i == 0) { if(Map.containsKey(i)) Map.put(i, Map.get(i) + 1); else Map.put(i, 1); N /= i; } } if (N > 2) { if(Map.containsKey(N)) Map.put(N, Map.get(N) + 1); else Map.put(N, 1); }} // Function to find the power// of prime number P in N!static int PowInFactN(int N, int P){ int ans = 0; int temp = P; // Loop until temp <= N while (temp <= N) { // Add the number of // numbers divisible // by N ans += N / temp; // Each time multiply // temp by P temp = temp * P; } // Returns ans return ans;} // Function that find the// powers of any P in N!static int findPowers(int N, int P){ // Find all prime factors // of number P findPrimeFactors(P); // To store the powers of // all prime factors Vector<Integer> Powers = new Vector<Integer>(); // Traverse the map for (Map.Entry<Integer, Integer> it : Map.entrySet()) { // Prime factor and // corres. powers int primeFac = it.getKey(); int facPow = it.getValue(); // Find power of prime // factor primeFac int p = PowInFactN(N, primeFac); // Divide frequency by // facPow p /= facPow; // Store the power of // primeFac^facPow Powers.add(p); } // Return the minimum // element in Power array return Collections.min(Powers);} // Driver's Codepublic static void main(String[] args){ int N = 24, P = 4; // Function to find power of // P in N! System.out.print(findPowers(N, P));}}// This code is contributed by Rajput-Ji |
Python3
# Python3 program to find the power # of P in N! import math# Map to store all # the prime factors of P Map = {} # Function to find the prime # factors of N im Map def findPrimeFactors(N): # Clear map Map.clear() # Check for factors of 2 while (N % 2 == 0): if 2 in Map: Map[2] += 1 else: Map[2] = 1 N = N // 2 # Find all the prime factors for i in range(3, int(math.sqrt(N)) + 1, 2): # If i is a factors # then increase the # frequency of i while (N % i == 0): if i in Map: Map[i] += 1 else: Map[i] = 1 N = N // i if (N > 2): if N in Map: Map[N] += 1 else: Map[N] = 1# Function to find the power # of prime number P in N! def PowInFactN(N, P): ans = 0 temp = P # Loop until temp <= N while (temp <= N): # Add the number of # numbers divisible # by N ans = ans + (N // temp) # Each time multiply # temp by P temp = temp * P # Returns ans return ans# Function that find the # powers of any P in N! def findPowers(N, P): # Find all prime factors # of number P findPrimeFactors(P) # To store the powers of # all prime factors Powers = [] # Traverse the map for it1, it2 in Map.items(): # Prime factor and # corres. powers primeFac = it1 facPow = it2 # Find power of prime # factor primeFac p = PowInFactN(N, primeFac) # Divide frequency by # facPow p = p // facPow # Store the power of # primeFac^facPow Powers.append(p) # Return the minimum # element in Power array return min(Powers)N, P = 24, 4# Driver codeif __name__ == "__main__": # Function to find # power of P in N! print(findPowers(N, P))# This code is contributed by divyeshrabadiya07 |
C#
// C# program to find the power// of P in N!using System;using System.Linq;using System.Collections.Generic;class GFG{// Map to store all the prime// factors of Pstatic Dictionary<int,int> Map = new Dictionary<int,int>();// Function to find the prime// factors of N im Mapstatic void findPrimeFactors(int N){ int i; // Clear map Map.Clear(); // Check for factors of 2 while (N % 2 == 0) { if(Map.ContainsKey(2)) Map[2] = Map[2] + 1; else Map.Add(2, 1); N /= 2; } // Find all the prime factors for (i = 3; i <= Math.Sqrt(N); i += 2) { // If i is a factors // then increase the // frequency of i while (N % i == 0) { if(Map.ContainsKey(i)) Map[i] = Map[i] + 1; else Map.Add(i, 1); N /= i; } } if (N > 2) { if(Map.ContainsKey(N)) Map[N] =Map[N] + 1; else Map.Add(N, 1); }}// Function to find the power// of prime number P in N!static int PowInFactN(int N, int P){ int ans = 0; int temp = P; // Loop until temp <= N while (temp <= N) { // Add the number of // numbers divisible // by N ans += N / temp; // Each time multiply // temp by P temp = temp * P; } // Returns ans return ans;}// Function that find the// powers of any P in N!static int findPowers(int N, int P){ // Find all prime factors // of number P findPrimeFactors(P); // To store the powers of // all prime factors List<int> Powers = new List<int>(); // Traverse the map foreach (KeyValuePair<int, int> it in Map) { // Prime factor and // corres. powers int primeFac = it.Key; int facPow = it.Value; // Find power of prime // factor primeFac int p = PowInFactN(N, primeFac); // Divide frequency by // facPow p /= facPow; // Store the power of // primeFac^facPow Powers.Add(p); } // Return the minimum // element in Power array return Powers.Min();}// Driver's Codepublic static void Main(String[] args){ int N = 24, P = 4; // Function to find power of // P in N! Console.Write(findPowers(N, P));}}// This code is contributed by sapnasingh4991 |
Javascript
// JavaScript program to find the power// of P in N!// Map to store all the prime// factors of Plet map = new Map();// unordered_map<int, int> Map;// Function to find the prime// factors of N im Mapfunction findPrimeFactors(N){ let i; // Clear map map.clear(); // Check for factors of 2 while (N % 2 == 0) { if(map.has(2)){ map.set(2, map.get(2) + 1); } else{ map.set(2, 1); } N = Math.floor(N/2); } // Find all the prime factors for (i = 3; i <= Math.sqrt(N); i += 2) { // If i is a factors // then increase the // frequency of i while (N % i == 0) { if(map.has(i)){ map.set(i, Map.get(i) + 1); } else{ map.set(i, 1); } N = Math.floor(N/i); } } if (N > 2) { if(map.has(N)){ map.set(N, map.get(N) + 1); } else{ map.set(N, 1); } }}// Function to find the power// of prime number P in N!function PowInFactN(N, P){ let ans = 0; let temp = P; // Loop until temp <= N while (temp <= N) { // Add the number of // numbers divisible // by N ans = ans + Math.floor(N / temp); // Each time multiply // temp by P temp = temp * P; } // Returns ans return ans;}// Function that find the// powers of any P in N!function findPowers(N, P){ // Find all prime factors // of number P findPrimeFactors(P); // To store the powers of // all prime factors let Powers = new Array(); // Traverse the map for (const [key,value] of map.entries()) { // Prime factor and // corres. powers let primeFac = key; let facPow = value; // Find power of prime // factor primeFac let p = PowInFactN(N, primeFac); // Divide frequency by // facPow p = Math.floor(p/facPow); // Store the power of // primeFac^facPow Powers.push(p); } // Return the minimum // element in Power array return Math.min(...Powers);}// Driver's Codelet N = 24;let P = 4;// Function to find power of// P in N!console.log(findPowers(N, P));// The code is contributed by Gautam goel (gautamgoel962) |
11
Time Complexity: O(sqrt(P)*(logP N))
Auxiliary Space: O(sqrt(P))
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
