Open In App

Count of multiplicative partitions of N

Last Updated : 16 Jul, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

Given an integer N, the task is to find the total number of multiplicative partitions for N.

Multiplicative Partition: Number of ways of factoring of an integer with all factors greater than 1.
 

Examples: 

Input: N = 20 
Output:
Explanation: 
Multiplicative partitions of 20 are: 
2 × 2 × 5 = 2 × 10 = 4 × 5 = 20.
Input: N = 30 
Output:
Explanation: 
Multiplicative partitions of 30 are: 
2 × 3 × 5 = 2 × 15 = 6 × 5 = 3 × 10 = 30 
 

 

Approach: The idea is to try for every divisor of the N and then recursively break the dividend to get the multiplicative partitions. Below are the illustrations of the steps of the approach:

  • Initialize minimum factor as 2. Since it is the minimum factor other than 1.
  • Start a loop from i = minimum to N – 1, and check if the number divides N and N/i > i, then increment the counter by 1 and again call the same function. Since i divides n so it means i and N/i can be factorized some more times.

For Example:

If N = 30, let i = min = 2 
30 % 2 = 0, so again recur with (2, 15) 
15 % 3 = 0, so again recur with (3, 5) 


and so on. 
 

Below is the implementation of the above approach:
 

C++




// C++ implementation to find
// the multiplicative partitions of
// the given number N
#include <bits/stdc++.h>
using namespace std;
 
// Function to return number of ways
// of factoring N with all
// factors greater than 1
static int getDivisors(int min, int n)
{
     
    // Variable to store number of ways
    // of factoring n with all
    // factors greater than 1
    int total = 0;
     
    for(int i = min; i < n; ++i)
    {
        if (n % i == 0 && n / i >= i)
        {
            ++total;
            if (n / i > i)
                total += getDivisors(i, n / i);
        }
    }
    return total;
}
 
// Driver code
int main()
{
    int n = 30;
     
    // 2 is the minimum factor of
    // number other than 1.
    // So calling recursive
    // function to find
    // number of ways of factoring N
    // with all factors greater than 1
    cout << 1 + getDivisors(2, n);
     
    return 0;
}
 
// This code is contributed by rutvik_56


Java




// Java implementation to find
// the multiplicative partitions of
// the given number N
 
class MultiPart {
 
    // Function to return number of ways
    // of factoring N with all
    // factors greater than 1
    static int getDivisors(int min, int n)
    {
 
        // Variable to store number of ways
        // of factoring n with all
        // factors greater than 1
        int total = 0;
 
        for (int i = min; i < n; ++i)
 
            if (n % i == 0 && n / i >= i) {
                ++total;
                if (n / i > i)
                    total
                        += getDivisors(
                            i, n / i);
            }
 
        return total;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int n = 30;
 
        // 2 is the minimum factor of
        // number other than 1.
        // So calling recursive
        // function to find
        // number of ways of factoring N
        // with all factors greater than 1
        System.out.println(
            1 + getDivisors(2, n));
    }
}


Python3




# Python3 implementation to find
# the multiplicative partitions of
# the given number N
 
# Function to return number of ways
# of factoring N with all
# factors greater than 1
def getDivisors(min, n):
     
    # Variable to store number of ways
    # of factoring n with all
    # factors greater than 1
    total = 0
 
    for i in range(min, n):
        if (n % i == 0 and n // i >= i):
            total += 1
            if (n // i > i):
                total += getDivisors(i, n // i)
                 
    return total
 
# Driver code
if __name__ == '__main__':
   
    n = 30
 
    # 2 is the minimum factor of
    # number other than 1.
    # So calling recursive
    # function to find
    # number of ways of factoring N
    # with all factors greater than 1
    print(1 + getDivisors(2, n))
 
# This code is contributed by mohit kumar 29


C#




// C# implementation to find
// the multiplicative partitions of
// the given number N
using System;
 
class GFG{
     
// Function to return number of ways
// of factoring N with all
// factors greater than 1
static int getDivisors(int min, int n)
{
 
    // Variable to store number of ways
    // of factoring n with all
    // factors greater than 1
    int total = 0;
 
    for(int i = min; i < n; ++i)
        if (n % i == 0 && n / i >= i)
        {
            ++total;
            if (n / i > i)
                total+= getDivisors(i, n / i);
        }
 
    return total;
}
 
// Driver code
public static void Main()
{
    int n = 30;
 
    // 2 is the minimum factor of
    // number other than 1.
    // So calling recursive
    // function to find
    // number of ways of factoring N
    // with all factors greater than 1
    Console.Write(1 + getDivisors(2, n));
}
}
 
// This code is contributed by adityakumar27200


Javascript




<script>
 
// Javascript implementation to find
// the multiplicative partitions of
// the given number N
 
// Function to return number of ways
// of factoring N with all
// factors greater than 1
function getDivisors(min, n)
{
     
    // Variable to store number of ways
    // of factoring n with all
    // factors greater than 1
    var total = 0;
     
    for(var i = min; i < n; ++i)
    {
        if (n % i == 0 && n / i >= i)
        {
            ++total;
            if (n / i > i)
                total += getDivisors(i, n / i);
        }
    }
    return total;
}
 
// Driver code
var n = 30;
 
// 2 is the minimum factor of
// number other than 1.
// So calling recursive
// function to find
// number of ways of factoring N
// with all factors greater than 1
document.write( 1 + getDivisors(2, n));
 
 
</script>


Output: 

5

 

Time Complexity: O(n)

Auxiliary Space: O(1)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads