Given three positive integers, L, R, K and an array arr[] consisting of N positive integers, the task is to count the number of ways to select at least K array elements from the given array having values in the range [L, R].
Examples:
Input: arr[] = {12, 4, 6, 13, 5, 10}, K = 3, L = 4, R = 10
Output: 5
Explanation:
Possible ways to select at least K(= 3) array elements having values in the range [4, 10] are: { (arr[1], arr[2], arr[4]), (arr[1], arr[2], arr[5]), (arr[1], arr[4], arr[5]), (arr[2], arr[4], arr[5]), (arr[1], arr[2], arr[4], arr[5]) }
Therefore, the required output is 5.
Input: arr[] = {1, 2, 3, 4, 5}, K = 4, L = 1, R = 5
Output: 6
Approach: Follow the steps below to solve the problem:
- Initialize a variable, say cntWays, to store the count of ways to select at least K array elements having values lies in the range [L, R].
- Initialize a variable, say cntNum to store the count of numbers in the given array whose values lies in the range given range.
- Finally, print the sum of all possible value of
such that (K + i) is less than or equal to cntNum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > calculateFactorial( int N)
{
vector< int > fact(N + 1);
fact[0] = 1;
for ( int i = 1; i <= N; i++) {
fact[i] = fact[i - 1] * i;
}
return fact;
}
int cntWaysSelection( int arr[], int N, int K,
int L, int R)
{
int cntWays = 0;
int cntNum = 0;
for ( int i = 0; i < N; i++) {
if (arr[i] >= L && arr[i] <= R) {
cntNum++;
}
}
vector< int > fact
= calculateFactorial(cntNum);
for ( int i = K; i <= cntNum; i++) {
cntWays += fact[cntNum] / (fact[i]
* fact[cntNum - i]);
}
return cntWays;
}
int main()
{
int arr[] = { 12, 4, 6, 13, 5, 10 };
int N = sizeof (arr) / sizeof (arr[0]);
int K = 3;
int L = 4;
int R = 10;
cout << cntWaysSelection(arr, N, K, L, R);
}
|
Java
class GFG{
static int [] calculateFactorial( int N)
{
int []fact = new int [N + 1 ];
fact[ 0 ] = 1 ;
for ( int i = 1 ; i <= N; i++) {
fact[i] = fact[i - 1 ] * i;
}
return fact;
}
static int cntWaysSelection( int arr[], int N, int K,
int L, int R)
{
int cntWays = 0 ;
int cntNum = 0 ;
for ( int i = 0 ; i < N; i++) {
if (arr[i] >= L && arr[i] <= R) {
cntNum++;
}
}
int []fact
= calculateFactorial(cntNum);
for ( int i = K; i <= cntNum; i++) {
cntWays += fact[cntNum] / (fact[i]
* fact[cntNum - i]);
}
return cntWays;
}
public static void main(String[] args)
{
int arr[] = { 12 , 4 , 6 , 13 , 5 , 10 };
int N = arr.length;
int K = 3 ;
int L = 4 ;
int R = 10 ;
System.out.print(cntWaysSelection(arr, N, K, L, R));
}
}
|
Python3
def calculateFactorial(N):
fact = [ 0 ] * (N + 1 )
fact[ 0 ] = 1
for i in range ( 1 , N + 1 ):
fact[i] = fact[i - 1 ] * i
return fact
def cntWaysSelection(arr, N, K, L, R):
cntWays = 0
cntNum = 0
for i in range ( 0 , N):
if (arr[i] > = L and arr[i] < = R):
cntNum + = 1
fact = list (calculateFactorial(cntNum))
for i in range (K, cntNum + 1 ):
cntWays + = fact[cntNum] / / (fact[i] *
fact[cntNum - i])
return cntWays
if __name__ = = "__main__" :
arr = [ 12 , 4 , 6 , 13 , 5 , 10 ]
N = len (arr)
K = 3
L = 4
R = 10
print (cntWaysSelection(arr, N, K, L, R))
|
C#
using System;
class GFG{
static int [] calculateFactorial( int N)
{
int [] fact = new int [(N + 1)];
fact[0] = 1;
for ( int i = 1; i <= N; i++)
{
fact[i] = fact[i - 1] * i;
}
return fact;
}
static int cntWaysSelection( int [] arr, int N, int K,
int L, int R)
{
int cntWays = 0;
int cntNum = 0;
for ( int i = 0; i < N; i++)
{
if (arr[i] >= L && arr[i] <= R)
{
cntNum++;
}
}
int [] fact = calculateFactorial(cntNum);
for ( int i = K; i <= cntNum; i++)
{
cntWays += fact[cntNum] / (fact[i] *
fact[cntNum - i]);
}
return cntWays;
}
public static void Main()
{
int [] arr = { 12, 4, 6, 13, 5, 10 };
int N = arr.Length;
int K = 3;
int L = 4;
int R = 10;
Console.WriteLine(cntWaysSelection(
arr, N, K, L, R));
}
}
|
Javascript
<script>
function calculateFactorial(N)
{
var fact = Array(N + 1);
fact[0] = 1;
for ( var i = 1; i <= N; i++) {
fact[i] = fact[i - 1] * i;
}
return fact;
}
function cntWaysSelection(arr, N, K, L, R)
{
var cntWays = 0;
var cntNum = 0;
for ( var i = 0; i < N; i++) {
if (arr[i] >= L && arr[i] <= R) {
cntNum++;
}
}
var fact = calculateFactorial(cntNum);
for ( var i = K; i <= cntNum; i++) {
cntWays += fact[cntNum] / (fact[i]
* fact[cntNum - i]);
}
return cntWays;
}
var arr = [ 12, 4, 6, 13, 5, 10 ];
var N = arr.length;
var K = 3;
var L = 4;
var R = 10;
document.write( cntWaysSelection(arr, N, K, L, R));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)