Open In App
Related Articles
• Write an Interview Experience
• Mathematical Algorithms

# Space and time efficient Binomial Coefficient

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:

1. Change r to n-r if r is greater than n-r. and create a variable to store the answer.
2. Run a loop from 0 to r-1
3. In every iteration update ans as (ans*(n-i))/(i+1) where i is the loop counter.
4. 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++

 `// Program to calculate C(n, k)`` ` `#include ``using` `namespace` `std;`` ` `// Returns value of Binomial Coefficient C(n, k)``int` `binomialCoeff(``int` `n, ``int` `k)``{``    ``int` `res = 1;`` ` `    ``// Since C(n, k) = C(n, n-k)``    ``if` `(k > n - k)``        ``k = n - k;`` ` `    ``// Calculate value of``    ``// [n * (n-1) *---* (n-k+1)] / [k * (k-1) *----* 1]``    ``for` `(``int` `i = 0; i < k; ++i) {``        ``res *= (n - i);``        ``res /= (i + 1);``    ``}`` ` `    ``return` `res;``}`` ` `// Driver Code``int` `main()``{``    ``int` `n = 8, k = 2;``    ``cout << ``"Value of C("` `<< n << ``", "` `<< k << ``") is "``         ``<< binomialCoeff(n, k);``    ``return` `0;``}`` ` `// This is code is contributed by rathbhupendra`

## C

 `// Program to calculate C(n, k)``#include `` ` `// Returns value of Binomial Coefficient C(n, k)``int` `binomialCoeff(``int` `n, ``int` `k)``{``    ``int` `res = 1;`` ` `    ``// Since C(n, k) = C(n, n-k)``    ``if` `(k > n - k)``        ``k = n - k;`` ` `    ``// Calculate value of``    ``// [n * (n-1) *---* (n-k+1)] / [k * (k-1) *----* 1]``    ``for` `(``int` `i = 0; i < k; ++i) {``        ``res *= (n - i);``        ``res /= (i + 1);``    ``}`` ` `    ``return` `res;``}`` ` `/* Driver program to test above function*/``int` `main()``{``    ``int` `n = 8, k = 2;``    ``printf``(``"Value of C(%d, %d) is %d "``, n, k,``           ``binomialCoeff(n, k));``    ``return` `0;``}`

## Java

 `// Program to calculate C(n, k) in java``class` `BinomialCoefficient {``    ``// Returns value of Binomial Coefficient C(n, k)``    ``static` `int` `binomialCoeff(``int` `n, ``int` `k)``    ``{``        ``int` `res = ``1``;`` ` `        ``// Since C(n, k) = C(n, n-k)``        ``if` `(k > n - k)``            ``k = n - k;`` ` `        ``// Calculate value of``        ``// [n * (n-1) *---* (n-k+1)] / [k * (k-1) *----* 1]``        ``for` `(``int` `i = ``0``; i < k; ++i) {``            ``res *= (n - i);``            ``res /= (i + ``1``);``        ``}`` ` `        ``return` `res;``    ``}`` ` `    ``/* Driver program to test above function*/``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `n = ``8``;``        ``int` `k = ``2``;``        ``System.out.println(``"Value of C("` `+ n + ``", "` `+ k``                           ``+ ``") "``                           ``+ ``"is"``                           ``+ ``" "` `+ binomialCoeff(n, k));``    ``}``}``// This Code is Contributed by Saket Kumar`

## Python3

 `# Python program to calculate C(n, k)`` ` `# Returns value of Binomial Coefficient``# C(n, k)``def` `binomialCoefficient(n, k):``    ``# since C(n, k) = C(n, n - k)``    ``if``(k > n ``-` `k):``        ``k ``=` `n ``-` `k``    ``# initialize result``    ``res ``=` `1``    ``# Calculate value of ``    ``# [n * (n-1) *---* (n-k + 1)] / [k * (k-1) *----* 1]``    ``for` `i ``in` `range``(k):``        ``res ``=` `res ``*` `(n ``-` `i)``        ``res ``=` `res ``/``/` `(i ``+` `1``)``    ``return` `res`` ` `# Driver program to test above function ``n ``=` `8``k ``=` `2``res ``=` `binomialCoefficient(n, k)``print``(``"Value of C(% d, % d) is % d"` `%``(n, k, res))`` ` `# This code is contributed by Aditi Sharma`

## C#

 `// C# Program to calculate C(n, k)``using` `System;`` ` `class` `BinomialCoefficient {`` ` `    ``// Returns value of Binomial``    ``// Coefficient C(n, k)``    ``static` `int` `binomialCoeff(``int` `n, ``int` `k)``    ``{``        ``int` `res = 1;`` ` `        ``// Since C(n, k) = C(n, n-k)``        ``if` `(k > n - k)``            ``k = n - k;`` ` `        ``// Calculate value of [n * ( n - 1) *---* (``        ``// n - k + 1)] / [k * (k - 1) *----* 1]``        ``for` `(``int` `i = 0; i < k; ++i) {``            ``res *= (n - i);``            ``res /= (i + 1);``        ``}`` ` `        ``return` `res;``    ``}`` ` `    ``// Driver Code``    ``public` `static` `void` `Main()``    ``{``        ``int` `n = 8;``        ``int` `k = 2;``        ``Console.Write(``"Value of C("` `+ n + ``", "` `+ k + ``") "``                      ``+ ``"is"``                      ``+ ``" "` `+ binomialCoeff(n, k));``    ``}``}`` ` `// This Code is Contributed by``// Smitha Dinesh Semwal.`

## PHP

 ` ``\$n` `- ``\$k` `)``        ``\$k` `= ``\$n` `- ``\$k``;`` ` `    ``// Calculate value of ``    ``// [n * (n-1) *---* (n-k+1)] / ``    ``// [k * (k-1) *----* 1]``    ``for` `(``\$i` `= 0; ``\$i` `< ``\$k``; ++``\$i``)``    ``{``        ``\$res` `*= (``\$n` `- ``\$i``);``        ``\$res` `/= (``\$i` `+ 1);``    ``}`` ` `    ``return` `\$res``;``}`` ` `    ``// Driver Code``    ``\$n` `= 8;``    ``\$k` `= 2;``    ``echo` `" Value of C (\$n, \$k) is "``,``             ``binomialCoeff(``\$n``, ``\$k``);`` ` `// This code is contributed by ajit.``?>`

## Javascript

 ``

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.