There are many problems where we have to compute C(n,k) i.e ( (n!)/( (n-k)! *(k!) ) ).
However,
computing C(n, k) can be a challenge when n and/or k are large. There are several tricks
like: Making k smaller (if k > n − k, then we set k = n − k) because n C k = n C (n−k) .
During intermediate computations, we divide the numbers first before multiply it with the
next number; or use BigInteger technique (last resort as BigInteger operations are slow).
But there is another method to which we all are familiar but don't actually remember .
We can use Pascal’s Triangle, a triangular array of binomial coefficients. The leftmost and
rightmost entries at each row are always 1. The inner values are the sum of two values directly
above it, as shown for row n = 5 below : The value of ith entry of line number n is C(n,i);
The below given code implements the formation of the pascal's triangle using a 2D array of size n*n.
The time complexity is of O(n^2) , but it's better than the general method of computing C(n,k) using multiplication.
#include<iostream>
#include<stdio.h>
using namespace std;
void printPascal(int n)
{
int arr[n][n];
for (int line = 0; line <= n; line++)
{
// Every line has number of integers equal to line number
for (int i = 0; i <= line; i++)
{
// First and last values in every row are 1
if (line == i || i == 0)
arr[line][i] = 1;
else // Other values are sum of values just above and left of above
arr[line][i] = arr[line-1][i-1] + arr[line-1][i];
printf("%d ", arr[line][i]);
}
printf("\n");
}
}
int main()
{
printPascal(5);
}
output :
However,
computing C(n, k) can be a challenge when n and/or k are large. There are several tricks
like: Making k smaller (if k > n − k, then we set k = n − k) because n C k = n C (n−k) .
During intermediate computations, we divide the numbers first before multiply it with the
next number; or use BigInteger technique (last resort as BigInteger operations are slow).
But there is another method to which we all are familiar but don't actually remember .
We can use Pascal’s Triangle, a triangular array of binomial coefficients. The leftmost and
rightmost entries at each row are always 1. The inner values are the sum of two values directly
above it, as shown for row n = 5 below : The value of ith entry of line number n is C(n,i);
1 n= 0 1 1 n= 1 1 2 1 n= 2 1 3 3 1 n = 3 1 4 6 4 1 n = 4 1 5 10 10 5 1 n = 5The value of ith entry of line number n is C(n,i).
The below given code implements the formation of the pascal's triangle using a 2D array of size n*n.
The time complexity is of O(n^2) , but it's better than the general method of computing C(n,k) using multiplication.
#include<iostream>
#include<stdio.h>
using namespace std;
void printPascal(int n)
{
int arr[n][n];
for (int line = 0; line <= n; line++)
{
// Every line has number of integers equal to line number
for (int i = 0; i <= line; i++)
{
// First and last values in every row are 1
if (line == i || i == 0)
arr[line][i] = 1;
else // Other values are sum of values just above and left of above
arr[line][i] = arr[line-1][i-1] + arr[line-1][i];
printf("%d ", arr[line][i]);
}
printf("\n");
}
}
int main()
{
printPascal(5);
}
output :
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
See this triangle for understanding the above given code.After going through the above topic , go through this link , and first try to solve this question using bit shift operator (<<) . Why are you getting wrong answer ? Try using pow() function.You would be getting correct answer . To know the difference between pow(2,n ) and 1<<n , go through This Link
Thank you and keep coding :)