Program to calculate the value of nCr Efficiently

22 Mar, 2021
Given two numbers n, r ( n>=r ). The task is to find the value of C(n, r) for big value of n.
Examples: 
Input: n = 30, r = 15
Output: 155117520
C(30, 15) is 155117520 by  30!/((30-15)!*15!)


Input: n = 50, r = 25
Output: 126410606437752
Approach: A simple code can be created with the following knowledge that : 
C(n, r) = [n * (n-1) * .... * (n-r+1)] / [r * (r-1) * .... * 1]
However, for big values of n, r the products may overflow, hence during each iteration we divide the current variables holding value of products by their gcd. 
Below is the required implementation: 
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation to find nCr#include <bits/stdc++.h>using namespace std; // Function to find the nCrvoid printNcR(int n, int r){     // p holds the value of n*(n-1)*(n-2)...,    // k holds the value of r*(r-1)...    long long p = 1, k = 1;     // C(n, r) == C(n, n-r),    // choosing the smaller value    if (n - r < r)        r = n - r;     if (r != 0) {        while (r) {            p *= n;            k *= r;             // gcd of p, k            long long m = __gcd(p, k);             // dividing by gcd, to simplify            // product division by their gcd            // saves from the overflow            p /= m;            k /= m;             n--;            r--;        }         // k should be simplified to 1        // as C(n, r) is a natural number        // (denominator should be 1 ) .    }     else        p = 1;     // if our approach is correct p = ans and k =1    cout << p << endl;} // Driver codeint main(){    int n = 50, r = 25;     printNcR(n, r);     return 0;}
// Java implementation to find nCr class GFG {     // Function to find the nCr    static void printNcR(int n, int r)    {         // p holds the value of n*(n-1)*(n-2)...,        // k holds the value of r*(r-1)...        long p = 1, k = 1;         // C(n, r) == C(n, n-r),        // choosing the smaller value        if (n - r < r) {            r = n - r;        }         if (r != 0) {            while (r > 0) {                p *= n;                k *= r;                 // gcd of p, k                long m = __gcd(p, k);                 // dividing by gcd, to simplify                // product division by their gcd                // saves from the overflow                p /= m;                k /= m;                 n--;                r--;            }             // k should be simplified to 1            // as C(n, r) is a natural number            // (denominator should be 1 ) .        }        else {            p = 1;        }         // if our approach is correct p = ans and k =1        System.out.println(p);    }     static long __gcd(long n1, long n2)    {        long gcd = 1;         for (int i = 1; i <= n1 && i <= n2; ++i) {            // Checks if i is factor of both integers            if (n1 % i == 0 && n2 % i == 0) {                gcd = i;            }        }        return gcd;    }     // Driver code    public static void main(String[] args)    {        int n = 50, r = 25;         printNcR(n, r);    }}
# Python3 implementation to find nCr from math import * # Function to find the nCr  def printNcR(n, r):     # p holds the value of n*(n-1)*(n-2)...,    # k holds the value of r*(r-1)...    p = 1    k = 1     # C(n, r) == C(n, n-r),    # choosing the smaller value    if (n - r < r):        r = n - r     if (r != 0):        while (r):            p *= n            k *= r             # gcd of p, k            m = gcd(p, k)             # dividing by gcd, to simplify product            # division by their gcd saves from            # the overflow            p //= m            k //= m             n -= 1            r -= 1         # k should be simplified to 1        # as C(n, r) is a natural number        # (denominator should be 1 )     else:        p = 1     # if our approach is correct p = ans and k =1    print(p)  # Driver codeif __name__ == "__main__":    n = 50    r = 25     printNcR(n, r) # this code is contributed by# ChitraNayal
// C# implementation to find nCr using System; public class GFG {     // Function to find the nCr    static void printNcR(int n, int r)    {         // p holds the value of n*(n-1)*(n-2)...,        // k holds the value of r*(r-1)...        long p = 1, k = 1;         // C(n, r) == C(n, n-r),        // choosing the smaller value        if (n - r < r) {            r = n - r;        }         if (r != 0) {            while (r > 0) {                p *= n;                k *= r;                 // gcd of p, k                long m = __gcd(p, k);                 // dividing by gcd, to simplify                // product division by their gcd                // saves from the overflow                p /= m;                k /= m;                 n--;                r--;            }             // k should be simplified to 1            // as C(n, r) is a natural number            // (denominator should be 1 ) .        }        else {            p = 1;        }         // if our approach is correct p = ans and k =1        Console.WriteLine(p);    }     static long __gcd(long n1, long n2)    {        long gcd = 1;         for (int i = 1; i <= n1 && i <= n2; ++i) {            // Checks if i is factor of both integers            if (n1 % i == 0 && n2 % i == 0) {                gcd = i;            }        }        return gcd;    }     // Driver code    static public void Main()    {        int n = 50, r = 25;        printNcR(n, r);    }    // This code is contributed by ajit.}
<?php// PHP implementation to find nCr     // Function to find the nCrfunction printNcR($n, $r) {         // p holds the value of n*(n-1)*(n-2)...,        // k holds the value of r*(r-1)...        $p = 1;        $k = 1;         // C(n, r) == C(n, n-r),        // choosing the smaller value        if ($n - $r < $r) {            $r = $n - $r;        }         if ($r != 0) {            while ($r > 0) {                $p *= $n;                $k *= $r;                 // gcd of p, k                $m = __gcd($p, $k);                 // dividing by gcd, to simplify product                // division by their gcd saves from the overflow                $p /= $m;                $k /= $m;                 $n--;                $r--;            }             // k should be simplified to 1            // as C(n, r) is a natural number            // (denominator should be 1 ) .        } else {            $p = 1;        }         // if our approach is correct p = ans and k =1        echo ($p);    }     function  __gcd($n1, $n2) {         $gcd = 1;         for ($i = 1; $i <= $n1 && $i <= $n2; ++$i) {            // Checks if i is factor of both integers            if ($n1 % $i == 0 && $n2 % $i == 0) {                $gcd = $i;            }        }        return $gcd;    }         // Driver code        $n = 50;        $r = 25;        printNcR($n, $r);  //This code is contributed by Sachin. ?>
<script> // Javascript implementation to find nCr function __gcd(n1, n2){    var gcd = 1;     for (var i = 1; i <= n1 && i <= n2; ++i) {        // Checks if i is factor of both integers        if (n1 % i == 0 && n2 % i == 0) {            gcd = i;        }    }    return gcd;} // Function to find the nCrfunction printNcR(n, r){     // p holds the value of n*(n-1)*(n-2)...,    // k holds the value of r*(r-1)...    var p = 1, k = 1;     // C(n, r) == C(n, n-r),    // choosing the smaller value    if (n - r < r)        r = n - r;     if (r != 0) {        while (r) {            p *= n;            k *= r;             // gcd of p, k            var m = __gcd(p, k);             // dividing by gcd, to simplify            // product division by their gcd            // saves from the overflow            p /= m;            k /= m;             n--;            r--;        }         // k should be simplified to 1        // as C(n, r) is a natural number        // (denominator should be 1 ) .    }     else        p = 1;     // if our approach is correct p = ans and k =1    document.write(p);} // Driver codevar n = 50, r = 25;printNcR(n, r); </script>
126410606437752
Time Complexity: O( R Log N) Auxiliary Space: O(1)
ukasp
29AjayKumar
jit_t
Sach_Code
ujjwalgoel1103
rutvik_56
GCD-LCM
Permutation and Combination
Technical Scripter 2018
Combinatorial
Mathematical
Mathematical
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count of subsets with sum equal to X
Find the K-th Permutation Sequence of first N natural numbers
Count Derangements (Permutation such that no element appears in its original position)
Print all possible strings of length k that can be formed from a set of n characters
Permutations of a given string using STL
Set in C++ Standard Template Library (STL)
C++ Data Types
Merge two sorted arrays
Operators in C / C++
Sieve of Eratosthenes