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++
#include <bits/stdc++.h>
using namespace std;
void printNcR( int n, int r)
{
long long p = 1, k = 1;
if (n - r < r)
r = n - r;
if (r != 0) {
while (r) {
p *= n;
k *= r;
long long m = __gcd(p, k);
p /= m;
k /= m;
n--;
r--;
}
}
else
p = 1;
cout << p << endl;
}
int main()
{
int n = 50, r = 25;
printNcR(n, r);
return 0;
}
|
Java
class GFG {
static void printNcR( int n, int r)
{
long p = 1 , k = 1 ;
if (n - r < r) {
r = n - r;
}
if (r != 0 ) {
while (r > 0 ) {
p *= n;
k *= r;
long m = __gcd(p, k);
p /= m;
k /= m;
n--;
r--;
}
}
else {
p = 1 ;
}
System.out.println(p);
}
static long __gcd( long n1, long n2)
{
long gcd = 1 ;
for ( int i = 1 ; i <= n1 && i <= n2; ++i) {
if (n1 % i == 0 && n2 % i == 0 ) {
gcd = i;
}
}
return gcd;
}
public static void main(String[] args)
{
int n = 50 , r = 25 ;
printNcR(n, r);
}
}
|
Python3
from math import *
def printNcR(n, r):
p = 1
k = 1
if (n - r < r):
r = n - r
if (r ! = 0 ):
while (r):
p * = n
k * = r
m = gcd(p, k)
p / / = m
k / / = m
n - = 1
r - = 1
else :
p = 1
print (p)
if __name__ = = "__main__" :
n = 50
r = 25
printNcR(n, r)
|
C#
using System;
public class GFG {
static void printNcR( int n, int r)
{
long p = 1, k = 1;
if (n - r < r) {
r = n - r;
}
if (r != 0) {
while (r > 0) {
p *= n;
k *= r;
long m = __gcd(p, k);
p /= m;
k /= m;
n--;
r--;
}
}
else {
p = 1;
}
Console.WriteLine(p);
}
static long __gcd( long n1, long n2)
{
long gcd = 1;
for ( int i = 1; i <= n1 && i <= n2; ++i) {
if (n1 % i == 0 && n2 % i == 0) {
gcd = i;
}
}
return gcd;
}
static public void Main()
{
int n = 50, r = 25;
printNcR(n, r);
}
}
|
PHP
<?php
function printNcR( $n , $r ) {
$p = 1;
$k = 1;
if ( $n - $r < $r ) {
$r = $n - $r ;
}
if ( $r != 0) {
while ( $r > 0) {
$p *= $n ;
$k *= $r ;
$m = __gcd( $p , $k );
$p /= $m ;
$k /= $m ;
$n --;
$r --;
}
} else {
$p = 1;
}
echo ( $p );
}
function __gcd( $n1 , $n2 ) {
$gcd = 1;
for ( $i = 1; $i <= $n1 && $i <= $n2 ; ++ $i ) {
if ( $n1 % $i == 0 && $n2 % $i == 0) {
$gcd = $i ;
}
}
return $gcd ;
}
$n = 50;
$r = 25;
printNcR( $n , $r );
?>
|
Javascript
<script>
function __gcd(n1, n2)
{
var gcd = 1;
for ( var i = 1; i <= n1 && i <= n2; ++i) {
if (n1 % i == 0 && n2 % i == 0) {
gcd = i;
}
}
return gcd;
}
function printNcR(n, r)
{
var p = 1, k = 1;
if (n - r < r)
r = n - r;
if (r != 0) {
while (r) {
p *= n;
k *= r;
var m = __gcd(p, k);
p /= m;
k /= m;
n--;
r--;
}
}
else
p = 1;
document.write(p);
}
var n = 50, r = 25;
printNcR(n, r);
</script>
|
Time Complexity: O( R Log N)
Auxiliary Space: O(1), since no extra space has been taken.