Given an array arr[] of n integers and an integer K, the task is to find the number of ways to select exactly K even numbers from the given array.
Examples:
Input: arr[] = {1, 2, 3, 4} k = 1
Output: 2
Explanation:
The number of ways in which we can select one even number is 2.
Input: arr[] = {61, 65, 99, 26, 57, 68, 23, 2, 32, 30} k = 2
Output:10
Explanation:
The number of ways in which we can select 2 even number is 10.
Approach: The idea is to apply the rule of combinatorics. For choosing r objects from the given n objects, the total number of ways of choosing is given by nCr. Below are the steps:
- Count the total number of even elements from the given array(say cnt).
- Check if the value of K is greater than cnt then the number of ways will be equal to 0.
- Otherwise, the answer will be nCk.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
long long f[12];
void fact()
{
f[0] = f[1] = 1;
for ( int i = 2; i <= 10; i++)
f[i] = i * 1LL * f[i - 1];
}
void solve( int arr[], int n, int k)
{
fact();
int even = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] % 2 == 0)
even++;
}
if (k > even)
cout << 0 << endl;
else {
cout << f[even] / (f[k] * f[even - k]);
}
}
int main()
{
int arr[] = { 1, 2, 3, 4 };
int n = sizeof arr / sizeof arr[0];
int k = 1;
solve(arr, n, k);
return 0;
}
|
Java
class GFG{
static int []f = new int [ 12 ];
static void fact()
{
f[ 0 ] = f[ 1 ] = 1 ;
for ( int i = 2 ; i <= 10 ; i++)
f[i] = i * 1 * f[i - 1 ];
}
static void solve( int arr[], int n, int k)
{
fact();
int even = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] % 2 == 0 )
even++;
}
if (k > even)
System.out.print( 0 + "\n" );
else
{
System.out.print(f[even] /
(f[k] * f[even - k]));
}
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 };
int n = arr.length;
int k = 1 ;
solve(arr, n, k);
}
}
|
Python3
f = [ 0 ] * 12
def fact():
f[ 0 ] = f[ 1 ] = 1
for i in range ( 2 , 11 ):
f[i] = i * 1 * f[i - 1 ]
def solve(arr, n, k):
fact()
even = 0
for i in range (n):
if (arr[i] % 2 = = 0 ):
even + = 1
if (k > even):
print ( 0 )
else :
print (f[even] / / (f[k] * f[even - k]))
arr = [ 1 , 2 , 3 , 4 ]
n = len (arr)
k = 1
solve(arr, n, k)
|
C#
using System;
class GFG{
static int []f = new int [12];
static void fact()
{
f[0] = f[1] = 1;
for ( int i = 2; i <= 10; i++)
f[i] = i * 1 * f[i - 1];
}
static void solve( int []arr, int n, int k)
{
fact();
int even = 0;
for ( int i = 0; i < n; i++)
{
if (arr[i] % 2 == 0)
even++;
}
if (k > even)
Console.Write(0 + "\n" );
else
{
Console.Write(f[even] /
(f[k] * f[even - k]));
}
}
public static void Main(String[] args)
{
int []arr = { 1, 2, 3, 4 };
int n = arr.Length;
int k = 1;
solve(arr, n, k);
}
}
|
Javascript
<script>
var f = Array(12).fill(0);
function fact()
{
f[0] = f[1] = 1;
for ( var i = 2; i <= 10; i++)
f[i] = i * 1 * f[i - 1];
}
function solve(arr, n, k)
{
fact();
var even = 0;
for ( var i = 0; i < n; i++) {
if (arr[i] % 2 == 0)
even++;
}
if (k > even)
document.write( 0 );
else {
document.write( f[even] / (f[k] * f[even - k]));
}
}
var arr = [ 1, 2, 3, 4 ];
var n = arr.length;
var k = 1;
solve(arr, n, k);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Efficient approach : Space optimization
we can optimize the space complexity of previous program by avoiding the use of an array to store factorials. We can compute the factorials on the go and use them directly in the calculation. This will reduce the space complexity from O(n) to O(1)
Implementation steps:
- Initialize a variable even to count the number of even numbers in the array.
- Loop through the array and increment even if the current number is even.
- Check if the number of even numbers to be chosen (k) is greater than the total number of even numbers in the array. If so, there is no way to pick k even numbers, so print 0 and return.
- Else compute the factorials on the go using two variables numerator and denominator.
- Loop from even down to even – k + 1, and multiply numerator by each number.
- Loop from 1 to k, and multiply denominator by each number.
- Compute and print the combination using numerator / denominator.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void solve( int arr[], int n, int k)
{
int even = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] % 2 == 0)
even++;
}
if (k > even)
cout << 0 << endl;
else {
long long numerator = 1;
long long denominator = 1;
for ( int i = even; i > even - k; i--)
numerator *= i;
for ( int i = 1; i <= k; i++)
denominator *= i;
cout << numerator / denominator << endl;
}
}
int main()
{
int arr[] = { 1, 2, 3, 4 };
int n = sizeof arr / sizeof arr[0];
int k = 1;
solve(arr, n, k);
return 0;
}
|
Java
import java.util.*;
class Main
{
static void solve( int [] arr, int n, int k)
{
int even = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] % 2 == 0 )
even++;
}
if (k > even)
System.out.println( 0 );
else {
long numerator = 1 ;
long denominator = 1 ;
for ( int i = even; i > even - k; i--)
numerator *= i;
for ( int i = 1 ; i <= k; i++)
denominator *= i;
System.out.println(numerator / denominator);
}
}
public static void main(String[] args)
{
int [] arr = { 1 , 2 , 3 , 4 };
int n = arr.length;
int k = 1 ;
solve(arr, n, k);
}
}
|
Python3
import math
def solve(arr, n, k):
even = 0
for i in range (n):
if arr[i] % 2 = = 0 :
even + = 1
if k > even:
print ( 0 )
else :
numerator = 1
denominator = 1
for i in range (even, even - k, - 1 ):
numerator * = i
for i in range ( 1 , k + 1 ):
denominator * = i
print ( int (numerator / denominator))
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 , 4 ]
n = len (arr)
k = 1
solve(arr, n, k)
|
C#
using System;
class GFG
{
static void Solve( int [] arr, int n, int k)
{
int even = 0;
for ( int i = 0; i < n; i++)
{
if (arr[i] % 2 == 0)
even++;
}
if (k > even)
Console.WriteLine(0);
else
{
long numerator = 1;
long denominator = 1;
for ( int i = even; i > even - k; i--)
numerator *= i;
for ( int i = 1; i <= k; i++)
denominator *= i;
Console.WriteLine(numerator / denominator);
}
}
public static void Main( string [] args)
{
int [] arr = { 1, 2, 3, 4 };
int n = arr.Length;
int k = 1;
Solve(arr, n, k);
}
}
|
Javascript
function solve(arr, n, k) {
let even = 0;
for (let i = 0; i < n; i++) {
if (arr[i] % 2 === 0) {
even += 1;
}
}
if (k > even) {
console.log(0);
} else {
let numerator = 1;
let denominator = 1;
for (let i = even; i > even - k; i--) {
numerator *= i;
}
for (let i = 1; i <= k; i++) {
denominator *= i;
}
console.log(Math.floor(numerator / denominator));
}
}
const arr = [1, 2, 3, 4];
const n = arr.length;
const k = 1;
solve(arr, n, k);
|
Output
2
Time complexity : O(N)
Auxiliary Space : O(1)