Dadas m y n que representan el número de mangos y el número de personas respectivamente. La tarea es calcular el número de formas de distribuir m mangos entre n personas. Considerando ambas variables m y n, llegamos a 4 casos de uso típicos donde se considera que los mangos y las personas son:
1) Ambos idénticos
2) Únicos e idénticos respectivamente
3) Idénticos y únicos respectivamente
4) Ambos únicos
Requisitos previos: Coeficiente binomial | Permutación y Combinación
Caso 1: Distribuir m mangos idénticos entre n personas idénticas
Si tratamos de distribuir m mangos en una fila, nuestro objetivo es dividir estos m mangos entre n personas sentadas en algún lugar entre arreglos de estos mangos. Todo lo que tenemos que hacer es agrupar estos m mangos en n conjuntos para que cada uno de estos n conjuntos se pueda asignar a n personas respectivamente.
Para realizar la tarea anterior, necesitamos particionar el arreglo inicial de los mangos usando n-1 divisores para crear n conjuntos de mangos. En este caso, necesitamos colocar m mangos y n-1 divisores todos juntos. Así que necesitamos maneras de calcular nuestra respuesta.
La ilustración que se muestra a continuación representa un ejemplo (una forma) de una disposición de particiones creada después de colocar 3 particiones, a saber, P1, P2, P3, que dividieron los 7 mangos en 4 particiones diferentes para que 4 personas puedan tener su propia porción de la partición respectiva:
Como todos los mangos se consideran idénticos, dividimos entre para deducir las entradas duplicadas. Del mismo modo, dividimos la expresión anterior nuevamente entre porque todas las personas también se consideran idénticas.
La expresión final que obtenemos es:
La expresión anterior es incluso igual al coeficiente binomial:
Ejemplo:
Input : m = 3, n = 2 Output : 4 There are four ways 3 + 0, 1 + 2, 2 + 1 and 0 + 3 Input : m = 13, n = 6 Output : 8568 Input : m = 11, n = 3 Output : 78
C++
// C++ code for calculating number of ways // to distribute m mangoes amongst n people // where all mangoes and people are identical #include <bits/stdc++.h> using namespace std; // function used to generate binomial coefficient // time complexity O(m) int binomial_coefficient(int n, int m) { int res = 1; if (m > n - m) m = n - m; for (int i = 0; i < m; ++i) { res *= (n - i); res /= (i + 1); } return res; } // helper function for generating no of ways // to distribute m mangoes amongst n people int calculate_ways(int m, int n) { // not enough mangoes to be distributed if (m < n) return 0; // ways -> (n+m-1)C(n-1) int ways = binomial_coefficient(n + m - 1, n - 1); return ways; } // Driver function int main() { // m represents number of mangoes // n represents number of people int m = 7, n = 5; int result = calculate_ways(m, n); printf("%d\n", result); return 0; }
Java
// Java code for calculating number of ways // to distribute m mangoes amongst n people // where all mangoes and people are identical import java.util.*; class GFG { // function used to generate binomial coefficient // time complexity O(m) public static int binomial_coefficient(int n, int m) { int res = 1; if (m > n - m) m = n - m; for (int i = 0; i < m; ++i) { res *= (n - i); res /= (i + 1); } return res; } // helper function for generating no of ways // to distribute m mangoes amongst n people public static int calculate_ways(int m, int n) { // not enough mangoes to be distributed if (m < n) { return 0; } // ways -> (n+m-1)C(n-1) int ways = binomial_coefficient(n + m - 1, n - 1); return ways; } // Driver function public static void main(String[] args) { // m represents number of mangoes // n represents number of people int m = 7, n = 5; int result = calculate_ways(m, n); System.out.println(Integer.toString(result)); System.exit(0); } }
Python3
# Python code for calculating number of ways # to distribute m mangoes amongst n people # where all mangoes and people are identical # function used to generate binomial coefficient # time complexity O(m) def binomial_coefficient(n, m): res = 1 if m > n - m: m = n - m for i in range(0, m): res *= (n - i) res /= (i + 1) return res # helper function for generating no of ways # to distribute m mangoes amongst n people def calculate_ways(m, n): # not enough mangoes to be distributed if m<n: return 0 # ways -> (n + m-1)C(n-1) ways = binomial_coefficient(n + m-1, n-1) return int(ways) # Driver function if __name__ == '__main__': # m represents number of mangoes # n represents number of people m = 7 ;n = 5 result = calculate_ways(m, n) print(result)
C#
// C# code for calculating number // of ways to distribute m mangoes // amongst n people where all mangoes // and people are identical using System; class GFG { // function used to generate // binomial coefficient // time complexity O(m) public static int binomial_coefficient(int n, int m) { int res = 1; if (m > n - m) m = n - m; for (int i = 0; i < m; ++i) { res *= (n - i); res /= (i + 1); } return res; } // helper function for generating // no of ways to distribute m // mangoes amongst n people public static int calculate_ways(int m, int n) { // not enough mangoes // to be distributed if (m < n) { return 0; } // ways -> (n+m-1)C(n-1) int ways = binomial_coefficient(n + m - 1, n - 1); return ways; } // Driver Code public static void Main() { // m represents number of mangoes // n represents number of people int m = 7, n = 5; int result = calculate_ways(m, n); Console.WriteLine(result.ToString()); } } // This code is contributed // by Subhadeep
PHP
<?php // PHP code for calculating number // of ways to distribute m mangoes // amongst n people where all // mangoes and people are identical // function used to generate // binomial coefficient // time complexity O(m) function binomial_coefficient($n, $m) { $res = 1; if ($m > $n - $m) $m = $n - $m; for ($i = 0; $i < $m; ++$i) { $res *= ($n - $i); $res /= ($i + 1); } return $res; } // Helper function for generating // no of ways to distribute m. // mangoes amongst n people function calculate_ways($m, $n) { // not enough mangoes to // be distributed if ($m < $n) return 0; // ways -> (n+m-1)C(n-1) $ways = binomial_coefficient($n + $m - 1, $n - 1); return $ways; } // Driver Code // m represents number of mangoes // n represents number of people $m = 7; $n = 5; $result = calculate_ways($m, $n); echo $result; // This code is contributed // by Shivi_Aggarwal ?>
Javascript
<script> // Javascript code for calculating number of ways // to distribute m mangoes amongst n people // where all mangoes and people are identical // function used to generate binomial coefficient // time complexity O(m) function binomial_coefficient(n, m) { let res = 1; if (m > n - m) m = n - m; for (let i = 0; i < m; ++i) { res *= (n - i); res /= (i + 1); } return res; } // helper function for generating no of ways // to distribute m mangoes amongst n people function calculate_ways(m, n) { // not enough mangoes to be distributed if (m < n) return 0; // ways -> (n+m-1)C(n-1) let ways = binomial_coefficient(n + m - 1, n - 1); return ways; } // Driver function // m represents number of mangoes // n represents number of people let m = 7, n = 5; let result = calculate_ways(m, n); document.write(result); // This code is contributed by Mayank Tyagi </script>
Producción:
330
Complejidad temporal: O(n)
Espacio auxiliar: O(1)
Caso 2: Distribuir m mangos únicos entre n personas idénticas
En este caso, para calcular el número de formas de distribuir m mangos únicos entre n personas idénticas, solo necesitamos multiplicar la última expresión que calculamos en el Caso 1 por .
Entonces, nuestra expresión final para este caso es
Prueba:
en el caso 1, inicialmente obtuvimos la expresión sin eliminar las entradas duplicadas.
En este caso, solo necesitamos dividir ya que todos los mangos se consideran únicos en este caso.
Entonces obtenemos la expresión como:
Multiplicando tanto el numerador como el denominador por ,
obtenemos
Donde ===
Complejidad temporal: O(max(n, m))
Espacio auxiliar: O(1)
Caso 3: Distribuir m mangos idénticos entre n personas únicas
En este caso, para calcular el número de formas de distribuir m mangos idénticos entre n personas únicas, solo necesitamos multiplicar la última expresión que calculamos en el Caso 1 por .
Así que nuestra expresión final para este caso es
Prueba:
Esta prueba es bastante similar a la expresión de prueba del último caso.
En el caso 1, inicialmente obtuvimos la expresión sin eliminar las entradas duplicadas.
En este caso, solo necesitamos dividir ya que todas las personas se consideran únicas en este caso.
Entonces obtenemos la expresión como:
Multiplicando tanto el numerador como el denominador por ,
obtenemos
Donde ===
Tiempo Complejidad: O(n)
Espacio auxiliar: O(1)
Para obtener referencias sobre cómo calcular , consulte aquí el factorial de un número
Caso 4: Distribuir m mangos únicos entre n personas únicas
En este caso necesitamos multiplicar la expresión obtenida en el caso 1 por ambos y .
Las pruebas para ambas multiplicaciones se definen en el caso 2 y el caso 3.
Por lo tanto, en este caso, nuestra expresión final resulta ser
Complejidad del tiempo: O(n+m)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por Harshit Saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA