Related Articles
Space and time efficient Binomial Coefficient
• Difficulty Level : Medium
• Last Updated : 22 Mar, 2021

Write a function that 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!) = 20```

We have discussed a 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.
Solution:

```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 ```

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.

Following implementation uses 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`

## Python

 `# 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.