Skip to main content

Problem 53 Project Euler Solution with python

Combinatoric selections

There are exactly ten ways of selecting three from five, 12345:
123, 124, 125, 134, 135, 145, 234, 235, 245, and 345
In combinatorics, we use the notation, 5C3 = 10.
In general,
nCr =
n!
r!(n−r)!
,where rn, n! = n×(n−1)×...×3×2×1, and 0! = 1.
It is not until n = 23, that a value exceeds one-million: 23C10 = 1144066.
How many, not necessarily distinct, values of  nCr, for 1 ≤ n ≤ 100, are greater than one-million?


This problem is also simple. There are few important points one has to consider before we can write a few for loops to solve the problem. You can call these points as algorithm also😊.

1) As you all know that two for loops required, one for n and one for r in nCr. According to the question the value of n(i.e first for loop) will start from 23 and end at 100. Value of r is discussed in (2).

2) The value of r in nCr will be in range of 4, n-4 i.e we can neglect the value of 0, 1, 2, 3, n-3, n-2, n-1, n. I have created my own proof for this one and here it goes:
nCr values r = 1,2,3
nCr values r = 1,2,3
nCr values r = 4
nCr values r = 4
As you can see from the above images that if we will take the values of r from 0,1,2,3,n-3, n-2, n-1, n, we will be in less than a million range. But the values can be in the range of 4 to n-4.

The same has been accomplished in the program. You can have a look at the program and you will for sure understand the program easily.

Program

I have used the inbuilt factorial function from math module.
for n in xrange(23, 101):
    for r in xrange(4,n-3):
xrange(a,b) generates all the numbers from a to b-1 and will not generate b. This is the reason why I have  used 101 instead of 100. This is the same reason why I have used n-3 instead of n-4 in the second for loop.

I think all the remaining things are simple enough.

You can download the source code from Github Gist pep53.py

Output


Summary

It just took me five minutes to write a solution for this problem. But I wanted to optimize my code and so I have printed all the iterations. Then I observed that the first three values and the last three values of a given n are always less than 1 million. Then I did some algebra and proved the result. This has optimized the code and had a very better performance. I am satisfied with the solution I have written. I don't know whether there is scope for improvement.

Please excuse me and correct me if my grammar is wrong or in an ambiguous way😃!

As always you can comment in the comment box if you have any doubt or didn't understand anything. I will be glad to help you.

Please don't hesitate to comment if you have found any typo or have a better program or have a different program, whatever programming language you might have used. Please do comment if you have any suggestion.

You can also contact me.

Thank you. Have a nice day😃!

Further reference: Math Captain - Combinations

Popular posts from this blog

Project Euler Problem 62 solution with python

Cubic permutations ¶ The cube, 41063625 (3453), can be permuted to produce two other cubes: 56623104 (3843) and 66430125 (4053). In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube. Find the smallest cube for which exactly five permutations of its digits are cube.

Project Euler Problem 67 Solution with Python

Maximum path sum II By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 3 7 4 2 4 6 8 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file containing a triangle with one-hundred rows.

Problem 43 Project Euler Solution with python

Sub-string divisibility The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property. Let d 1 be the 1 st digit, d 2 be the 2 nd digit, and so on. In this way, we note the following: d 2 d 3 d 4 =406 is divisible by 2 d 3 d 4 d 5 =063 is divisible by 3 d 4 d 5 d 6 =635 is divisible by 5 d 5 d 6 d 7 =357 is divisible by 7 d 6 d 7 d 8 =572 is divisible by 11 d 7 d 8 d 9 =728 is divisible by 13 d 8 d 9 d 10 =289 is divisible by 17 Find the sum of all 0 to 9 pandigital numbers with this property. One might write a simple solution using direct if else statements for this problem. Using if else statements, the execution time may be a few seconds. But this is not a very good approach. I too had written a program with if else statement which will take each and every permutation of the 0-9 Pandigital and check for the conditions given in the qu...