Given m and n representing number of mangoes and number of people respectively. Task is to calculate number of ways to distribute m mangoes among n people. Considering both variables m and n, we arrive at 4 typical use cases where mangoes and people are considered to be:
1) Both identical
2) Unique and identical respectively
3) Identical and unique respectively
4) Both unique
Prerequisites: Binomial Coefficient | Permutation and Combination
Case 1: Distributing m identical mangoes amongst n identical people
If we try to spread m mangoes in a row, our goal is to divide these m mangoes among n people sitting somewhere between arrangement of these mangoes. All we need to do is pool these m mangoes into n sets so that each of these n sets can be allocated to n people respectively.
To accomplish above task, we need to partition the initial arrangement of mangoes by using n-1 partitioners to create n sets of mangoes. In this case we need to arrange m mangoes and n-1 partitioners all together. So we need
ways to calculate our answer.
Illustration given below represents an example(a way) of an arrangement of partitions created after placing 3 partitioners namely P1, P2, P3 which partitioned all 7 mangoes into 4 different partitions so that 4 people can have their own portion of respective partition:

As all the mangoes are considered to be identical, we divide
by
to deduct the duplicate entries. Similarly, we divide the above expression again by
because all people are considered to be identical too.
The final expression we get is : 
The above expression is even-actually equal to the binomial coefficient: 
Example:
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++
#include <bits/stdc++.h>
using namespace std;
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;
}
int calculate_ways( int m, int n)
{
if (m < n)
return 0;
int ways = binomial_coefficient(n + m - 1, n - 1);
return ways;
}
int main()
{
int m = 7, n = 5;
int result = calculate_ways(m, n);
printf ( "%d\n" , result);
return 0;
}
|
Java
import java.util.*;
class GFG {
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;
}
public static int calculate_ways( int m, int n)
{
if (m < n) {
return 0 ;
}
int ways = binomial_coefficient(n + m - 1 , n - 1 );
return ways;
}
public static void main(String[] args)
{
int m = 7 , n = 5 ;
int result = calculate_ways(m, n);
System.out.println(Integer.toString(result));
System.exit( 0 );
}
}
|
Python3
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
def calculate_ways(m, n):
if m<n:
return 0
ways = binomial_coefficient(n + m - 1 , n - 1 )
return int (ways)
if __name__ = = '__main__' :
m = 7 ;n = 5
result = calculate_ways(m, n)
print (result)
|
C#
using System;
class GFG
{
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;
}
public static int calculate_ways( int m, int n)
{
if (m < n)
{
return 0;
}
int ways = binomial_coefficient(n + m - 1,
n - 1);
return ways;
}
public static void Main()
{
int m = 7, n = 5;
int result = calculate_ways(m, n);
Console.WriteLine(result.ToString());
}
}
|
PHP
<?php
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 ;
}
function calculate_ways( $m , $n )
{
if ( $m < $n )
return 0;
$ways = binomial_coefficient( $n + $m - 1,
$n - 1);
return $ways ;
}
$m = 7;
$n = 5;
$result = calculate_ways( $m , $n );
echo $result ;
?>
|
Javascript
<script>
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;
}
function calculate_ways(m, n)
{
if (m < n)
return 0;
let ways = binomial_coefficient(n + m - 1, n - 1);
return ways;
}
let m = 7, n = 5;
let result = calculate_ways(m, n);
document.write(result);
</script>
|
Output:
330
Time Complexity : O(n)
Auxiliary Space : O(1)
Case 2: Distributing m unique mangoes amongst n identical people
In this case, to calculate the number of ways to distribute m unique mangoes amongst n identical people, we just need to multiply the last expression
we calculated in Case 1 by
.
So our final expression for this case is 
Proof:
In case 1, initially we got the expression
without removing duplicate entries.
In this case, we only need to divide
as all mangoes are considered to be unique in this case.
So we get the expression as : 
Multiplying both numerator and denominator by
,
we get 
Where
=== 
Time Complexity : O(max(n, m))
Auxiliary Space : O(1)
Case 3: Distributing m identical mangoes amongst n unique people
In this case, to calculate the number of ways to distribute m identical mangoes amongst n unique people, we just need to multiply the last expression
we calculated in Case 1 by
.
So our final expression for this case is 
Proof:
This Proof is pretty much similar to the proof of last case expression.
In case 1, initially we got the expression
without removing duplicate entries.
In this case, we only need to divide
as all people are considered to be unique in this case.
So we get the expression as : 
Multiplying both numerator and denominator by
,
we get 
Where
=== 
Time Complexity : O(n)
Auxiliary Space : O(1)
For references on how to calculate
refer here factorial of a number
Case 4: Distributing m unique mangoes amongst n unique people
In this case we need to multiply the expression obtained in case 1 by both
and
.
The proofs for both of the multiplications are defined in case 2 and case 3.
Hence, in this case, our final expression comes out to be 
Time Complexity : O(n+m)
Auxiliary Space : O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
06 May, 2021
Like Article
Save Article