Dados dos números enteros N y R , la tarea es calcular el número de formas de distribuir N objetos idénticos en R grupos distintos.
Ejemplos:
Entrada: N = 4, R = 2
Salida: 5
Número de objetos en el 1er grupo = 0, en el segundo grupo = 4
Número de objetos en el 1er grupo = 1, en el segundo grupo = 3
Número de objetos en el 1er grupo = 2, en segundo grupo = 2
No de objetos en el 1er grupo = 3, en el segundo grupo = 1
No de objetos en el 1er grupo = 4, en el segundo grupo = 0Entrada: N = 4, R = 3
Salida: 15
Enfoque: la idea es usar el teorema multinomial . Supongamos que x 1 objetos se colocan en el primer grupo, x 2 objetos se colocan en el segundo grupo y x R objetos se colocan en el grupo Rth . Se da que,
x 1 + x 2 + x 3 +…+ x R = N
La solución de esta ecuación por teorema multinomial viene dada por N + R – 1 C R – 1 .
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 return the // value of ncr effectively int ncr(int n, int r) { // Initialize the answer int ans = 1; for (int i = 1; i <= r; i += 1) { // Divide simultaneously by // i to avoid overflow ans *= (n - r + i); ans /= i; } return ans; } // Function to return the number of // ways to distribute N identical // objects in R distinct objects int NoOfDistributions(int N, int R) { return ncr(N + R - 1, R - 1); } // Driver code int main() { int N = 4, R = 3; // Function call cout << NoOfDistributions(N, R); return 0; }
Java
// Java implementation of the above approach import java.util.*; class GFG { // Function to return the // value of ncr effectively static int ncr(int n, int r) { // Initialize the answer int ans = 1; for (int i = 1; i <= r; i += 1) { // Divide simultaneously by // i to avoid overflow ans *= (n - r + i); ans /= i; } return ans; } // Function to return the number of // ways to distribute N identical // objects in R distinct objects static int NoOfDistributions(int N, int R) { return ncr(N + R - 1, R - 1); } // Driver code public static void main(String[] args) { int N = 4, R = 3; // Function call System.out.println(NoOfDistributions(N, R)); } } // This code is contributed by Princi Singh
Python3
# Python3 implementation of the above approach # Function to return the # value of ncr effectively def ncr(n, r): # Initialize the answer ans = 1 for i in range(1, r+1): # Divide simultaneously by # i to avoid overflow ans *= (n - r + i) ans //= i return ans # Function to return the number of # ways to distribute N identical # objects in R distinct objects def NoOfDistributions(N, R): return ncr(N + R-1, R - 1) # Driver code N = 4 R = 3 # Function call print(NoOfDistributions(N, R)) # This code is contributed by mohit kumar 29
C#
// C# implementation of the above approach using System; class GFG { // Function to return the // value of ncr effectively static int ncr(int n, int r) { // Initialize the answer int ans = 1; for (int i = 1; i <= r; i += 1) { // Divide simultaneously by // i to avoid overflow ans *= (n - r + i); ans /= i; } return ans; } // Function to return the number of // ways to distribute N identical // objects in R distinct objects static int NoOfDistributions(int N, int R) { return ncr(N + R - 1, R - 1); } // Driver code static public void Main() { int N = 4, R = 3; // Function call Console.WriteLine(NoOfDistributions(N, R)); } } // This code is contributed by AnkitRai01
Javascript
<script> // Javascript implementation of the above approach // Function to return the // value of ncr effectively function ncr(n, r) { // Initialize the answer let ans = 1; for(let i = 1; i <= r; i += 1) { // Divide simultaneously by // i to avoid overflow ans *= (n - r + i); ans = parseInt(ans / i); } return ans; } // Function to return the number of // ways to distribute N identical // objects in R distinct objects function NoOfDistributions(N, R) { return ncr(N + R - 1, R - 1); } // Driver code let N = 4, R = 3; // Function call document.write(NoOfDistributions(N, R)); // This code is contributed by subhammahato348 </script>
15
Complejidad de tiempo: O(R)
Espacio Auxiliar: O(1)