Program to calculate the value of nCr Efficiently

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

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation to find nCr
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the nCr
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 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 code
int main()
{
    int n = 50, r = 25;
  
    printNcR(n, r);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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 code
if __name__ == "__main__":
    n = 50
    r = 25
  
    printNcR(n, r)
      
# this code is contributed by 
# ChitraNayal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.    
}

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation to find nCr 
      
// Function to find the nCr 
function 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. 
  
?>

chevron_right


Output:

126410606437752


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Ita_c, 29AjayKumar, jit_t, Sach_Code