Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Count of Ways to Choose N People With at Least X Men and Y Women from P Men and Q Women | Set 2

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given integers N, P, Q, X, and Y, the task is to find the number of ways to form a group of N people having at least X men and Y women from P men and Q women, where (X + Y ≤ N, X ≤ P and Y ≤ Q).

Examples:

Input: P = 4, Q = 2, N = 5, X = 3, Y = 1
Output: 6
Explanation: Suppose given pool is {m1, m2, m3, m4} and {w1, w2}. Then possible combinations are:
m1 m2 m3 m4 w1
m1 m2 m3 m4 w2
m1 m2 m3 w1 w2
m1 m2 m4 w1 w2
m1 m3 m4 w1 w2
m2 m3 m4 w1 w2
Hence the count is 6.

Input: P = 5, Q = 2, N = 6, X = 4, Y = 1
Output: 7

 

Naive Approach: This problem is based on combinatorics, and details of the Naive approach is already discussed in Set-1 of this problem. 

For some general value of P, Q, N, X and Y we can calculate the total possible ways using the following formula:

_{X}^{P}\textrm{C} \ast _{N-X}^{Q}\textrm{C} + _{X+1}^{P}\textrm{C} \ast _{N-X-1}^{Q}\textrm{C} + . . . + _{N-Y+1}^{P}\textrm{C} \ast _{Y-1}^{Q}\textrm{C} + _{N-Y}^{P}\textrm{C} \ast _{Y}^{Q}\textrm{C}

where 

_{r}^{n}\textrm{C} = \frac{n!}{r!*(n-r)!}

In this approach at every step we were calculating the value for each possible way. 

Time Complexity: O(N2)
Auxiliary Space: O(1)

Efficient Approach: To solve this problem efficiently, we can use the Pascal Triangle property to calculate the _{r}^{n}\textrm{C}          , i.e.

1
1 1
1 2 1
1 3 3 1
.
.
.

which is nothing but

_{0}^{0}\textrm{C}
_{0}^{1}\textrm{C}            _{1}^{1}\textrm{C}
_{0}^{2}\textrm{C}            _{1}^{2}\textrm{C}            _{2}^{2}\textrm{C}
_{0}^{3}\textrm{C}            _{1}^{3}\textrm{C}            _{2}^{3}\textrm{C}            _{3}^{3}\textrm{C}
.
.
.

Follow the steps mentioned below:

  • Use the pascal triangle to precalculate the values of the combination.
  • Start iterating a loop from i = X to i = P and do the following for each iteration.
  • Check if (N-i) ≥ Y and (N-i) ≤ Q.
  • If the condition is satisfied then count the possible ways for i men and (N-i) women, otherwise, skip the step.
  • Add the count with the total number of ways.
  • Return the total count as your answer.

Below is the implementation of the approach:

C++




#include <bits/stdc++.h>
using namespace std;
 
long long int pascal[31][31];
 
// Function to calculate the pascal triangle
void pascalTriangle()
{
    pascal[0][0] = 1;
    pascal[1][0] = 1;
    pascal[1][1] = 1;
 
    // Loop to calculate values of
    // pascal triangle
    for (int i = 2; i < 31; i++) {
        pascal[i][0] = 1;
        for (int j = 1; j < i; j++)
            pascal[i][j]
                = pascal[i - 1][j]
                  + pascal[i - 1][j - 1];
        pascal[i][i] = 1;
    }
}
 
// Function to calculate the number of ways
long long int countWays(int n, int p,
                        int q, int x,
                        int y)
{
 
    // Variable to store the answer
    long long int sum = 0;
 
    // Loop to calculate the number of ways
    for (long long int i = x; i <= p; i++) {
        if (n - i >= y && n - i <= q)
            sum += pascal[p][i]
                   * pascal[q][n - i];
    }
    return sum;
}
 
// Driver code
int main()
{
    pascalTriangle();
 
    int P = 4, Q = 2, N = 5, X = 3, Y = 1;
 
    // Calculate possible ways for given
    // N, P, Q, X and Y
    cout << countWays(N, P, Q, X, Y)
         << endl;
    return 0;
}

Java




// Java code for the above approach
import java.io.*;
class GFG {
 
    static long pascal[][] = new long[31][31];
 
    // Function to calculate the pascal triangle
    static void pascalTriangle()
    {
        pascal[0][0] = 1;
        pascal[1][0] = 1;
        pascal[1][1] = 1;
 
        // Loop to calculate values of
        // pascal triangle
        for (int i = 2; i < 31; i++) {
            pascal[i][0] = 1;
            for (int j = 1; j < i; j++)
                pascal[i][j] = pascal[i - 1][j]
                               + pascal[i - 1][j - 1];
            pascal[i][i] = 1;
        }
    }
 
    // Function to calculate the number of ways
    static long countWays(int n, int p, int q, int x, int y)
    {
 
        // Variable to store the answer
        long sum = 0;
 
        // Loop to calculate the number of ways
        for (int i = x; i <= p; i++) {
            if (n - i >= y && n - i <= q)
                sum += pascal[p][i] * pascal[q][n - i];
        }
        return sum;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        pascalTriangle();
        int P = 4, Q = 2, N = 5, X = 3, Y = 1;
 
        // Calculate possible ways for given
        // N, P, Q, X and Y
        System.out.println(countWays(N, P, Q, X, Y));
    }
}
 
// This code is contributed by Potta Lokesh

Python3




pascal = [[0 for i in range(31)] for j in range(31)]
 
# Function to calculate the pascal triangle
def pascalTriangle():
  pascal[0][0] = 1;
  pascal[1][0] = 1;
  pascal[1][1] = 1;
 
  # Loop to calculate values of
  # pascal triangle
  for i in range(2, 31):
    pascal[i][0] = 1;
    for j in range(i):
      pascal[i][j] = pascal[i - 1][j] + pascal[i - 1][j - 1];
    pascal[i][i] = 1;
 
# Function to calculate the number of ways
def countWays(n, p, q, x, y):
 
  # Variable to store the answer
  sum = 0;
 
  # Loop to calculate the number of ways
  for i in range(x, p + 1):
    if (n - i >= y and n - i <= q):
      sum += pascal[p][i] * pascal[q][n - i];
  return sum;
 
# Driver code
pascalTriangle();
 
P = 4
Q = 2
N = 5
X = 3
Y = 1;
 
# Calculate possible ways for given
# N, P, Q, X and Y
print(countWays(N, P, Q, X, Y))
 
# This code is contributed by Saurabh Jaiswal

C#




// C# code for the above approach
using System;
 
class GFG{
 
static long [,]pascal = new long[31, 31];
 
// Function to calculate the pascal triangle
static void pascalTriangle()
{
    pascal[0, 0] = 1;
    pascal[1, 0] = 1;
    pascal[1, 1] = 1;
 
    // Loop to calculate values of
    // pascal triangle
    for(int i = 2; i < 31; i++)
    {
        pascal[i, 0] = 1;
        for(int j = 1; j < i; j++)
            pascal[i, j] = pascal[i - 1, j] +
                           pascal[i - 1, j - 1];
        pascal[i, i] = 1;
    }
}
 
// Function to calculate the number of ways
static long countWays(int n, int p, int q, int x, int y)
{
     
    // Variable to store the answer
    long sum = 0;
 
    // Loop to calculate the number of ways
    for(int i = x; i <= p; i++)
    {
        if (n - i >= y && n - i <= q)
            sum += pascal[p, i] * pascal[q, n - i];
    }
    return sum;
}
 
// Driver code
public static void Main(String[] args)
{
    pascalTriangle();
     
    int P = 4, Q = 2, N = 5, X = 3, Y = 1;
 
    // Calculate possible ways for given
    // N, P, Q, X and Y
    Console.WriteLine(countWays(N, P, Q, X, Y));
}
}
 
// This code is contributed by shikhasingrajput

Javascript




<script>
let pascal = new Array(31).fill(0).map(() => new Array(31).fill(0));
 
// Function to calculate the pascal triangle
function pascalTriangle() {
  pascal[0][0] = 1;
  pascal[1][0] = 1;
  pascal[1][1] = 1;
 
  // Loop to calculate values of
  // pascal triangle
  for (let i = 2; i < 31; i++) {
    pascal[i][0] = 1;
    for (let j = 1; j < i; j++)
      pascal[i][j]
        = pascal[i - 1][j]
        + pascal[i - 1][j - 1];
    pascal[i][i] = 1;
  }
}
 
// Function to calculate the number of ways
function countWays(n, p, q, x, y) {
 
  // Variable to store the answer
  let sum = 0;
 
  // Loop to calculate the number of ways
  for (let i = x; i <= p; i++) {
    if (n - i >= y && n - i <= q)
      sum += pascal[p][i]
        * pascal[q][n - i];
  }
  return sum;
}
 
// Driver code
pascalTriangle();
 
let P = 4, Q = 2, N = 5, X = 3, Y = 1;
 
// Calculate possible ways for given
// N, P, Q, X and Y
document.write(countWays(N, P, Q, X, Y))
 
// This code is contributed by gfgking.
</script>

Output

6

Time Complexity: O(N)
Auxiliary Space: O(N2)

 


My Personal Notes arrow_drop_up
Last Updated : 07 Dec, 2021
Like Article
Save Article
Similar Reads
Related Tutorials