Check if a number exists with X divisors out of which Y are composite - GeeksforGeeks

23 Apr, 2021
Given two integers X and Y representing the total number of divisors and the number of composite divisors respectively, the task is to check if there exists an integer N which has exactly X divisors and Y are composite numbers. 
Examples:
 Input: X = 6, Y = 3 Output: YES Explanation: N = 18 is such a number.The divisors of 18 are 1, 2, 3, 6, 9 and 18. The composite divisors of 18 are 6, 9 and 18.Input: X = 7, Y = 3 Output: NO Explanation: We see that no such number exists that has 7 positive divisors out of which 3 are composite divisors.  
Approach:  
Firstly calculate the number of prime divisors of a number, which is equal to: 
Firstly calculate the number of prime divisors of a number, which is equal to: 
                 Number of prime divisors = Total number of divisors – Number of composite divisors – 1  
So, the number of prime divisors, C = X – Y – 1  Since every number has 1 as a factor and 1 is neither a prime number nor a composite number, we have to exclude it from being counted in the number of prime divisors.  If the number of composite divisors is less than the number of prime divisors, then it is not possible to find such a number at all.  So if the prime factorization of X contains at least C distinct integers, then a solution is possible. Otherwise, we cannot find a number N that will satisfy the given conditions.  Find the maximum number of values X can be decomposed into such that each value is greater than 1. In other words, we can find out the prime factorization of X.If that prime factorization has a number of terms greater than or equal to C, then such a number is possible.
So, the number of prime divisors, C = X – Y – 1  
Since every number has 1 as a factor and 1 is neither a prime number nor a composite number, we have to exclude it from being counted in the number of prime divisors.  
If the number of composite divisors is less than the number of prime divisors, then it is not possible to find such a number at all.  
So if the prime factorization of X contains at least C distinct integers, then a solution is possible. Otherwise, we cannot find a number N that will satisfy the given conditions.  
Find the maximum number of values X can be decomposed into such that each value is greater than 1. In other words, we can find out the prime factorization of X.
If that prime factorization has a number of terms greater than or equal to C, then such a number is possible.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ program to check if a number// exists having exactly X positive// divisors out of which Y are// composite divisors#include <bits/stdc++.h>using namespace std; int factorize(int N){    int count = 0;    int cnt = 0;     // Count the number of    // times 2 divides N    while ((N % 2) == 0) {        N = N / 2;        count++;    }     cnt = cnt + count;     // check for all possible    // numbers that can divide it    for (int i = 3; i <= sqrt(N); i += 2) {        count = 0;        while (N % i == 0) {            count++;            N = N / i;        }        cnt = cnt + count;    }     // if N at the end    // is a prime number.    if (N > 2)        cnt = cnt + 1;    return cnt;} // Function to check if any// such number existsvoid ifNumberExists(int X, int Y){    int C, dsum;     C = X - Y - 1;    dsum = factorize(X);    if (dsum >= C)        cout << "YES \n";    else        cout << "NO \n";} // Driver Codeint main(){     int X, Y;    X = 6;    Y = 4;     ifNumberExists(X, Y);    return 0;}
// Java program to check if a number// exists having exactly X positive// divisors out of which Y are// composite divisorsimport java.lang.Math;class GFG{     public static int factorize(int N){    int count = 0;    int cnt = 0;         // Count the number of    // times 2 divides N    while ((N % 2) == 0)    {        N = N / 2;        count++;    }         cnt = cnt + count;         // Check for all possible    // numbers that can divide it    for(int i = 3; i <= Math.sqrt(N); i += 2)    {       count = 0;       while (N % i == 0)       {           count++;           N = N / i;       }       cnt = cnt + count;    }         // If N at the end    // is a prime number.    if (N > 2)        cnt = cnt + 1;    return cnt;}     // Function to check if any// such number existspublic static void ifNumberExists(int X, int Y){    int C, dsum;    C = X - Y - 1;    dsum = factorize(X);             if (dsum >= C)        System.out.println("YES");    else        System.out.println("NO");} // Driver code   public static void main(String[] args){    int X, Y;    X = 6;    Y = 4;         ifNumberExists(X, Y);}} // This code is contributed by divyeshrabadiya07
# Python3 program to check if a number exists# having exactly X positive divisors out of#  which Y are composite divisorsimport math def factorize(N):     count = 0    cnt = 0     # Count the number of    # times 2 divides N    while ((N % 2) == 0):        N = N // 2        count+=1     cnt = cnt + count     # Check for all possible    # numbers that can divide it    sq = int(math.sqrt(N))    for i in range(3, sq, 2):        count = 0                 while (N % i == 0):            count += 1            N = N // i                 cnt = cnt + count     # If N at the end    # is a prime number.    if (N > 2):        cnt = cnt + 1    return cnt # Function to check if any# such number existsdef ifNumberExists(X, Y):     C = X - Y - 1    dsum = factorize(X)         if (dsum >= C):        print ("YES")    else:        print("NO") # Driver Codeif __name__ == "__main__":         X = 6    Y = 4     ifNumberExists(X, Y) # This code is contributed by chitranayal
// C# program to check if a number// exists having exactly X positive// divisors out of which Y are// composite divisorsusing System;class GFG{ public static int factorize(int N){    int count = 0;    int cnt = 0;         // Count the number of    // times 2 divides N    while ((N % 2) == 0)    {        N = N / 2;        count++;    }         cnt = cnt + count;         // Check for all possible    // numbers that can divide it    for(int i = 3; i <= Math.Sqrt(N); i += 2)    {        count = 0;        while (N % i == 0)        {            count++;            N = N / i;        }        cnt = cnt + count;    }         // If N at the end    // is a prime number.    if (N > 2)        cnt = cnt + 1;    return cnt;}     // Function to check if any// such number existspublic static void ifNumberExists(int X, int Y){    int C, dsum;    C = X - Y - 1;    dsum = factorize(X);             if (dsum >= C)        Console.WriteLine("YES");    else        Console.WriteLine("NO");} // Driver codepublic static void Main(string[] args){    int X, Y;    X = 6;    Y = 4;         ifNumberExists(X, Y);}} // This code is contributed by AnkitRai01
<script>// javascript program to check if a number// exists having exactly X positive// divisors out of which Y are// composite divisors     function factorize(N) {        var count = 0;        var cnt = 0;         // Count the number of        // times 2 divides N        while ((N % 2) == 0) {            N = N / 2;            count++;        }         cnt = cnt + count;         // Check for all possible        // numbers that can divide it        for (i = 3; i <= Math.sqrt(N); i += 2) {            count = 0;            while (N % i == 0) {                count++;                N = N / i;            }            cnt = cnt + count;        }         // If N at the end        // is a prime number.        if (N > 2)            cnt = cnt + 1;        return cnt;    }     // Function to check if any    // such number exists    function ifNumberExists(X , Y) {        var C, dsum;        C = X - Y - 1;        dsum = factorize(X);         if (dsum >= C)            document.write("YES");        else            document.write("NO");    }     // Driver code             var X, Y;        X = 6;        Y = 4;         ifNumberExists(X, Y); // This code is contributed by todaysgaurav</script>
YES
 
Time Complexity: O (N 1/2) Auxiliary Space: O (1) 
divyeshrabadiya07
ukasp
ankthon
todaysgaurav
divisors
number-theory
Algorithms
Combinatorial
Competitive Programming
Mathematical
number-theory
Mathematical
Combinatorial
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
DSA Sheet by Love Babbar
Quadratic Probing in Hashing
SCAN (Elevator) Disk Scheduling Algorithms
K means Clustering - Introduction
Program for SSTF disk scheduling algorithm
Write a program to print all permutations of a given string
Permutation and Combination in Python
itertools.combinations() module in Python to print all possible combinations
Factorial of a large number
Count ways to reach the nth stair using step 1, 2 or 3