Skip to content
Related Articles

Related Articles

Check if a number can be expressed as a product of exactly K prime divisors
  • Difficulty Level : Medium
  • Last Updated : 04 May, 2020
GeeksforGeeks - Summer Carnival Banner

Given an integer N, the task is to check if it can be expressed as a product of exactly K prime divisors.

Examples:

Input: N = 12, K = 3
Output: Yes
Explanation:
12 can be expressed as product of 2×2×3.

Input: N = 14, K = 3
Output:  No
Explanation:
14 can be only expressed as product of 2×7.

Approach:

To solve the problem mentioned above we are given the value N and we will find the maximum number of values we can split N into. We can represent prime factorization of N as \prod_{i=1}^{K} {p_{i}}^{a_{i}} where pi are the prime factors of N and ai are the exponents. We know that total number of divisors of N is \prod_{i=1}^{K} (a_{i}+1). Therefore, we can observe that we have to check whether it is possible to represent N as product of K numbers or not. If the maximum split is less than K then it is not possible to express it in exactly K prime divisors, else it is always possible.

C++




// CPP implementation to Check if a
// number can be expressed as a
// product of exactly K prime divisors
  
#include <bits/stdc++.h>
using namespace std;
  
// function to find K prime divisors
void KPrimeDivisors(int N, int K)
{
    int maximum_split = 0;
  
    // count number of 2s that divide N
    while (N % 2 == 0) {
        maximum_split++;
        N /= 2;
    }
  
    // N must be odd at this point.
    // So we can skip one element
    for (int i = 3; i * i <= N; i = i + 2) {
  
        while (N % i == 0) {
            // divide the value of N
            N = N / i;
  
            // increment count
            maximum_split++;
        }
    }
  
    // Condition to handle the case when n
    // is a prime number greater than 2
    if (N > 2)
        maximum_split++;
  
    // check if maximum_split is less than K
    // then it not possible
    if (maximum_split < K) {
        printf("No\n");
        return;
    }
  
    printf("Yes\n");
}
  
/* Driver code */
int main()
{
    // initialise N and K
    int N = 12;
    int K = 3;
  
    KPrimeDivisors(N, K);
  
    return 0;
}

Java




// Java implementation to Check if a 
// number can be expressed as a 
// product of exactly K prime divisors 
class GFG {
      
    // function to find K prime divisors 
    static void KPrimeDivisors(int N, int K) 
    
        int maximum_split = 0
      
        // count number of 2s that divide N 
        while (N % 2 == 0) { 
            maximum_split++; 
            N /= 2
        
      
        // N must be odd at this point. 
        // So we can skip one element 
        for (int i = 3; i * i <= N; i = i + 2) { 
      
            while (N % i == 0) { 
                // divide the value of N 
                N = N / i; 
      
                // increment count 
                maximum_split++; 
            
        
      
        // Condition to handle the case when n 
        // is a prime number greater than 2 
        if (N > 2
            maximum_split++; 
      
        // check if maximum_split is less than K 
        // then it not possible 
        if (maximum_split < K) { 
            System.out.println("No"); 
            return
        
      
        System.out.println("Yes"); 
    
      
    /* Driver code */
    public static void main (String[] args)
    
        // initialise N and K 
        int N = 12
        int K = 3
      
        KPrimeDivisors(N, K); 
    
}
  
// This code is contributed by Yash_R

Python3




# Python implementation to Check if a
# number can be expressed as a
# product of exactly K prime divisors
  
import math as mt 
  
# function to find K prime divisors
def KPrimeDivisors(n, k): 
      
    # To count maximum split of N
    maximum_split = 0
      
    # count number of 2s that divide N
    while n % 2 == 0
        maximum_split+= 1
        n = n // 2
          
    # n must be odd at this point 
    # so we skip one element 
    for i in range(3, mt.ceil(mt.sqrt(n)), 2): 
        while n % i == 0
            n = n / i; 
            maximum_split+= 1
              
    # Condition to handle the case when n
    # is a prime number greater than 2 
    if n > 2
        maximum_split+= 1
          
    # check if maximum_split is less than K
    # then it not possible
    if maximum_split < k: 
        print("No")
        return
  
    print("Yes")
          
      
  
# Driver code 
N = 12
K = 3
KPrimeDivisors(N, K)

C#




      
// C# implementation to Check if a 
// number can be expressed as a 
// product of exactly K prime divisors 
using System;
  
class GFG {
       
    // function to find K prime divisors 
    static void KPrimeDivisors(int N, int K) 
    
        int maximum_split = 0; 
       
        // count number of 2s that divide N 
        while (N % 2 == 0) { 
            maximum_split++; 
            N /= 2; 
        
       
        // N must be odd at this point. 
        // So we can skip one element 
        for (int i = 3; i * i <= N; i = i + 2) { 
       
            while (N % i == 0) { 
  
                // divide the value of N 
                N = N / i; 
       
                // increment count 
                maximum_split++; 
            
        
       
        // Condition to handle the case when n 
        // is a prime number greater than 2 
        if (N > 2) 
            maximum_split++; 
       
        // check if maximum_split is less than K 
        // then it not possible 
        if (maximum_split < K) { 
            Console.WriteLine("No"); 
            return
        
       
        Console.WriteLine("Yes"); 
    
       
    /* Driver code */
    public static void Main(String[] args)
    
        // initialise N and K 
        int N = 12; 
        int K = 3; 
       
        KPrimeDivisors(N, K); 
    
}
  
// This code is contributed by 29AjayKumar
Output:
Yes

Time Complexity: O(sqrt(N))

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.




My Personal Notes arrow_drop_up
Recommended Articles
Page :