# Space and time efficient Binomial Coefficient

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

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

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).

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

 `// 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; ` `} `

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

 ` ``\$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. ` `?> `

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.