Número de secuencias de longitud N cuyo producto es M

Dados dos enteros N y M , la tarea es encontrar el conteo de posibles secuencias a 1 , a 2 , … de longitud N tal que el producto de todos los elementos de la secuencia sea M .
Ejemplos: 
 

Entrada: N = 2, M = 6 
Salida:
Las secuencias posibles son {1, 6}, {2, 3}, {3, 2} y {6, 1}
Entrada: N = 3, M = 24 
Salida: 30 
 

Acercarse: 
 

  • Considere la descomposición en factores primos de M como p 1 k 1 p 2 k 2 …p z k z .
  • Para cada factor primo, su exponente se tiene que distribuir entre N grupos diferentes porque al multiplicar esos N términos, se sumarán los exponentes de los factores primos. Esto se puede hacer usando la fórmula explicada aquí .
  • Para cada factor primo, el número de formas de distribuir sus exponentes en N secuencias sería igual a 
    N + K i -1 C N-1 para cada 1 ≤ i ≤ z .
  • Utilizando el principio fundamental de la multiplicación, multiplica los resultados de todos los factores primos para obtener la respuesta.

A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate the
// value of ncr effectively
int ncr(int n, int r)
{
 
    // Initializing the result
    int res = 1;
 
    for (int i = 1; i <= r; i += 1) {
 
        // Multiply and divide simultaneously
        // to avoid overflow
        res *= (n - r + i);
        res /= i;
    }
 
    // Return the answer
    return res;
}
 
// Function to return the number of sequences
// of length N such that their product is M
int NoofSequences(int N, int M)
{
 
    // Hashmap to store the prime factors of M
    unordered_map<int, int> prime;
 
    // Calculate the prime factors of M
    for (int i = 2; i <= sqrt(M); i += 1) {
 
        // If i divides M it means it is a factor
        // Divide M by i till it could be
        // divided to store the exponent
        while (M % i == 0) {
 
            // Increase the exponent count
            prime[i] += 1;
            M /= i;
        }
    }
 
    // If the number is a prime number
    // greater than sqrt(M)
    if (M > 1) {
        prime[M] += 1;
    }
 
    // Initializing the ans
    int ans = 1;
 
    // Multiply the answer for every prime factor
    for (auto it : prime) {
 
        // it.second represents the
        // exponent of every prime factor
        ans *= (ncr(N + it.second - 1, N - 1));
    }
 
    // Return the result
    return ans;
}
 
// Driver code
int main()
{
    int N = 2, M = 6;
 
    cout << NoofSequences(N, M);
 
    return 0;
}

Java

// Java implementation of the above approach
import java.util.HashMap;
 
class geeks
{
 
    // Function to calculate the
    // value of ncr effectively
    public static int nCr(int n, int r)
    {
 
        // Initializing the result
        int res = 1;
        for (int i = 1; i <= r; i++)
        {
 
            // Multiply and divide simultaneously
            // to avoid overflow
            res *= (n - r + i);
            res /= i;
        }
 
        // Return the answer
        return res;
    }
 
    // Function to return the number of sequences
    // of length N such that their product is M
    public static int NoofSequences(int N, int M)
    {
         
        // Hashmap to store the prime factors of M
        HashMap<Integer, Integer> prime = new HashMap<>();
 
        // Calculate the prime factors of M
        for (int i = 2; i <= Math.sqrt(M); i++)
        {
 
            // If i divides M it means it is a factor
            // Divide M by i till it could be
            // divided to store the exponent
            while (M % i == 0)
            {
 
                // Increase the exponent count
                if (prime.get(i) == null)
                    prime.put(i, 1);
                else
                {
                    int x = prime.get(i);
                    prime.put(i, ++x);
                }
                M /= i;
            }
        }
 
        // If the number is a prime number
        // greater than sqrt(M)
        if (M > 1)
        {
            if (prime.get(M) != null)
            {
                int x = prime.get(M);
                prime.put(M, ++x);
            }
            else
                prime.put(M, 1);
        }
 
        // Initializing the ans
        int ans = 1;
 
        // Multiply the answer for every prime factor
        for (HashMap.Entry<Integer, Integer> entry : prime.entrySet())
        {
 
            // entry.getValue() represents the
            // exponent of every prime factor
            ans *= (nCr(N + entry.getValue() - 1, N - 1));
        }
 
        // Return the result
        return ans;
    }
     
    // Driver code
    public static void main(String[] args)
    {
        int N = 2, M = 6;
        System.out.println(NoofSequences(N, M));
    }
}
 
// This code is contributed by
// sanjeev2552

Python3

# Python3 implementation of the above approach
 
# Function to calculate the
# value of ncr effectively
def ncr(n, r):
 
 
    # Initializing the result
    res = 1
 
    for i in range(1,r+1):
 
        # Multiply and divide simultaneously
        # to avoid overflow
        res *= (n - r + i)
        res //= i
 
    # Return the answer
    return res
 
# Function to return the number of sequences
# of length N such that their product is M
def NoofSequences(N, M):
 
    # Hashmap to store the prime factors of M
    prime={}
 
    # Calculate the prime factors of M
    for i in range(2,int(M**(.5))+1):
 
        # If i divides M it means it is a factor
        # Divide M by i till it could be
        # divided to store the exponent
        while (M % i == 0):
 
            # Increase the exponent count
            prime[i]= prime.get(i,0)+1
            M //= i
 
 
    # If the number is a prime number
    # greater than sqrt(M)
    if (M > 1):
        prime[M] =prime.get(M,0) + 1
 
    # Initializing the ans
    ans = 1
 
    # Multiply the answer for every prime factor
    for it in prime:
 
        # it.second represents the
        # exponent of every prime factor
        ans *= (ncr(N + prime[it] - 1, N - 1))
 
    # Return the result
    return ans
 
# Driver code
 
N = 2
M = 6
 
print(NoofSequences(N, M))
 
# This code is contributed by mohit kumar 29

C#

// C# implementation of the approach
using System;
using System.Collections.Generic;
     
public class geeks
{
  
    // Function to calculate the
    // value of ncr effectively
    public static int nCr(int n, int r)
    {
  
        // Initializing the result
        int res = 1;
        for (int i = 1; i <= r; i++)
        {
  
            // Multiply and divide simultaneously
            // to avoid overflow
            res *= (n - r + i);
            res /= i;
        }
  
        // Return the answer
        return res;
    }
  
    // Function to return the number of sequences
    // of length N such that their product is M
    public static int NoofSequences(int N, int M)
    {
          
        // Hashmap to store the prime factors of M
        Dictionary<int,int>prime = new Dictionary<int,int>();
  
        // Calculate the prime factors of M
        for (int i = 2; i <= Math.Sqrt(M); i++)
        {
  
            // If i divides M it means it is a factor
            // Divide M by i till it could be
            // divided to store the exponent
            while (M % i == 0)
            {
  
                // Increase the exponent count
                if (!prime.ContainsKey(i))
                    prime.Add(i, 1);
                else
                {
                    int x = prime[i];
                    prime.Remove(i);
                    prime.Add(i, ++x);
                }
                M /= i;
            }
        }
  
        // If the number is a prime number
        // greater than sqrt(M)
        if (M > 1)
        {
            if (prime.ContainsKey(M))
            {
                int x = prime[M];
                prime.Remove(M);
                prime.Add(M, ++x);
            }
            else
                prime.Add(M, 1);
        }
  
        // Initializing the ans
        int ans = 1;
  
        // Multiply the answer for every prime factor
        foreach(KeyValuePair<int, int> entry in prime)
        {
  
            // entry.getValue() represents the
            // exponent of every prime factor
            ans *= (nCr(N + entry.Value - 1, N - 1));
        }
  
        // Return the result
        return ans;
    }
      
    // Driver code
    public static void Main(String[] args)
    {
        int N = 2, M = 6;
        Console.WriteLine(NoofSequences(N, M));
    }
}
 
// This code is contributed by Princi Singh

Javascript

<script>
// Javascript implementation of the above approach
 
    // Function to calculate the
    // value of ncr effectively
    function nCr(n,r)
    {
        // Initializing the result
        let res = 1;
        for (let i = 1; i <= r; i++)
        {
   
            // Multiply and divide simultaneously
            // to avoid overflow
            res *= (n - r + i);
            res =Math.floor(res/ i);
        }
   
        // Return the answer
        return res;
    }
     
    // Function to return the number of sequences
    // of length N such that their product is M
    function NoofSequences(N,M)
    {
        // Hashmap to store the prime factors of M
        let prime = new Map();
   
        // Calculate the prime factors of M
        for (let i = 2; i <= Math.sqrt(M); i++)
        {
   
            // If i divides M it means it is a factor
            // Divide M by i till it could be
            // divided to store the exponent
            while (M % i == 0)
            {
   
                // Increase the exponent count
                if (prime.get(i) == null)
                    prime.set(i, 1);
                else
                {
                    let x = prime.get(i);
                    prime.set(i, ++x);
                }
                M = Math.floor(M/i);
            }
        }
   
        // If the number is a prime number
        // greater than sqrt(M)
        if (M > 1)
        {
            if (prime.get(M) != null)
            {
                let x = prime.get(M);
                prime.set(M, ++x);
            }
            else
                prime.set(M, 1);
        }
   
        // Initializing the ans
        let ans = 1;
   
        // Multiply the answer for every prime factor
        for (let [key, value] of prime.entries())
        {
   
            // entry.getValue() represents the
            // exponent of every prime factor
            ans *= (nCr(N + value - 1, N - 1));
        }
   
        // Return the result
        return ans;
    }
     
    // Driver code
    let N = 2, M = 6;
    document.write(NoofSequences(N, M));
 
// This code is contributed by patel2127
</script>
Producción: 

4

 

Publicación traducida automáticamente

Artículo escrito por CrazyPro y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *