Given three numbers n, r and p, compute value of nCr mod p.
Input: n = 10, r = 2, p = 13 Output: 6 Explanation: 10C2 is 45 and 45 % 13 is 6.
We strongly recommend that you click here and practice it, before moving on to the solution.
A Simple Solution is to first compute nCr, then compute nCr % p. This solution works fine when the value of nCr is small.
What if the value of nCr is large?
The value of nCr%p is generally needed for large values of n when nCr cannot fit in a variable, and causes overflow. So computing nCr and then using modular operator is not a good idea as there will be overflow even for slightly larger values of n and r. For example the methods discussed here and here cause overflow for n = 50 and r = 40.
The idea is to compute nCr using below formula
C(n, r) = C(n-1, r-1) + C(n-1, r) C(n, 0) = C(n, n) = 1
Working of Above formula and Pascal Triangle:
Let us see how above formula works for C(4, 3)
1==========>> n = 0, C(0, 0) = 1
1–1========>> n = 1, C(1, 0) = 1, C(1, 1) = 1
1–2–1======>> n = 2, C(2, 0) = 1, C(2, 1) = 2, C(2, 2) = 1
1–3–3–1====>> n = 3, C(3, 0) = 1, C(3, 1) = 3, C(3, 2) = 3, C(3, 3)=1
1–4–6–4–1==>> n = 4, C(4, 0) = 1, C(4, 1) = 4, C(4, 2) = 6, C(4, 3)=4, C(4, 4)=1
So here every loop on i, builds i’th row of pascal triangle, using (i-1)th row
Extension of above formula for modular arithmetic:
We can use distributive property of modulor operator to find nCr % p using above formula.
C(n, r)%p = [ C(n-1, r-1)%p + C(n-1, r)%p ] % p C(n, 0) = C(n, n) = 1
The above formula can implemented using Dynamic Programming using a 2D array.
The 2D array based dynamic programming solution can be further optimized by constructing one row at a time. See Space optimized version in below post for details.
Below is implementation based on the space optimized version discussed in above post.
Value of nCr % p is 6
Time complexity of above solution is O(n*r) and it requires O(r) space. There are more and better solutions to above problem.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.
- Vertex Cover Problem | Set 2 (Dynamic Programming Solution for Tree)
- Bitmasking and Dynamic Programming | Set-2 (TSP)
- Dynamic Programming on Trees | Set-1
- Dynamic Programming on Trees | Set 2
- Greedy approach vs Dynamic programming
- Double Knapsack | Dynamic Programming
- Convert N to M with given operations using dynamic programming
- How to solve a Dynamic Programming Problem ?
- Ackermann's function using Dynamic programming
- Top 20 Dynamic Programming Interview Questions
- Number of Unique BST with a given key | Dynamic Programming
- Dynamic Programming | Building Bridges
- Dynamic Programming vs Divide-and-Conquer
- Python | Implementing Dynamic programming using Dictionary
- Optimal Substructure Property in Dynamic Programming | DP-2
- Longest subsequence with a given OR value : Dynamic Programming Approach
- Overlapping Subproblems Property in Dynamic Programming | DP-1
- Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
- Distinct palindromic sub-strings of the given string using Dynamic Programming
- Optimal Strategy for the Divisor game using Dynamic Programming