Space and time efficient Binomial Coefficient
Last Updated :
11 Sep, 2023
Here the function takes two parameters n and k and returns the value of Binomial Coefficient C(n, k).
Example:
Input: n = 4 and k = 2
Output: 6
Explanation: 4 C 2 is 4!/(2!*2!) = 6
Input: n = 5 and k = 2
Output: 10
Explanation: 5 C 2 is 5!/(3!*2!) = 10
We have discussed O(n*k) time and O(k) extra space algorithm in this post. The value of C(n, k) can be calculated in O(k) time and O(1) extra space.
Approach:
- Change r to n-r if r is greater than n-r. and create a variable to store the answer.
- Run a loop from 0 to r-1
- In every iteration update ans as (ans*(n-i))/(i+1) where i is the loop counter.
- So the answer will be equal to ((n/1)*((n-1)/2)*…*((n-r+1)/r) which is equal to nCr.
C(n, k)
= n! / (n-k)! * k!
= [n * (n-1) *....* 1] / [ ( (n-k) * (n-k-1) * .... * 1) *
( k * (k-1) * .... * 1 ) ]
After simplifying, we get
C(n, k)
= [n * (n-1) * .... * (n-k+1)] / [k * (k-1) * .... * 1]
Also, C(n, k) = C(n, n-k)
// r can be changed to n-r if r > n-r
Following implementation uses the above formula to calculate C(n, k).
C++
#include <bits/stdc++.h>
using namespace std;
int binomialCoeff( int n, int k)
{
int res = 1;
if (k > n - k)
k = n - k;
for ( int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
int main()
{
int n = 8, k = 2;
cout << "Value of C(" << n << ", " << k << ") is "
<< binomialCoeff(n, k);
return 0;
}
|
C
#include <stdio.h>
int binomialCoeff( int n, int k)
{
int res = 1;
if (k > n - k)
k = n - k;
for ( int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
int main()
{
int n = 8, k = 2;
printf ( "Value of C(%d, %d) is %d " , n, k,
binomialCoeff(n, k));
return 0;
}
|
Java
class BinomialCoefficient {
static int binomialCoeff( int n, int k)
{
int res = 1 ;
if (k > n - k)
k = n - k;
for ( int i = 0 ; i < k; ++i) {
res *= (n - i);
res /= (i + 1 );
}
return res;
}
public static void main(String[] args)
{
int n = 8 ;
int k = 2 ;
System.out.println( "Value of C(" + n + ", " + k
+ ") "
+ "is"
+ " " + binomialCoeff(n, k));
}
}
|
Python3
def binomialCoefficient(n, k):
if (k > n - k):
k = n - k
res = 1
for i in range (k):
res = res * (n - i)
res = res / / (i + 1 )
return res
n = 8
k = 2
res = binomialCoefficient(n, k)
print ( "Value of C(% d, % d) is % d" % (n, k, res))
|
C#
using System;
class BinomialCoefficient {
static int binomialCoeff( int n, int k)
{
int res = 1;
if (k > n - k)
k = n - k;
for ( int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
public static void Main()
{
int n = 8;
int k = 2;
Console.Write( "Value of C(" + n + ", " + k + ") "
+ "is"
+ " " + binomialCoeff(n, k));
}
}
|
PHP
<?php
function binomialCoeff( $n , $k )
{
$res = 1;
if ( $k > $n - $k )
$k = $n - $k ;
for ( $i = 0; $i < $k ; ++ $i )
{
$res *= ( $n - $i );
$res /= ( $i + 1);
}
return $res ;
}
$n = 8;
$k = 2;
echo " Value of C ($n, $k) is " ,
binomialCoeff( $n , $k );
?>
|
Javascript
<script>
function binomialCoeff(n, k)
{
let res = 1;
if (k > n - k)
k = n - k;
for (let i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
let n = 8;
let k = 2;
document.write( "Value of C(" + n + ", " + k + ") "
+ "is"
+ " " + binomialCoeff(n, k));
</script>
|
Output
Value of C(8, 2) is 28
Complexity Analysis:
Time Complexity: O(r) A loop has to be run from 0 to r. So, the time complexity is O(r).
Auxiliary Space: O(1) As no extra space is required.
This article is compiled by Aashish Barnwal and reviewed by the GeeksforGeeks team.
Share your thoughts in the comments
Please Login to comment...