Problem statement:
Given a number 'n', design an algorithm that will output the smallest integer number 'X' which contains only the digits {0, 1} such that X mod n = 0 and X > 0 (1 ≤ n ≤ 100000)Problem credits: Ayush on the Stony Brook Puzzle Society Facebook Group
Insight: Suppose n = 6. Consider some numerator (target answer X) to be 1101. Can this be correct? We can verify by dividing and checking the remainder. 1101 mod 6 = 3, so we've overshot the answer by 3 or more (since we might not have the smallest X).
Another way to get the same remainder '3' is to say:
- 1000 mod 6 = 4
- 100 mod 6 = 4
- 00 mod 6 = 0
- 1 mod 6 = 1
Which basically means that we want to find that subset of powers of 10, added together (mod n) leave a remainder of 0. We can solve this using dynamic programming using a technique similar to the one used to solve the subset sum problem. The solution to our problem (and to the subset sum problem) is pseudo-polynomial. Specifically, our problem is solved in time O(n log X).
Here is the ideone link, and below is the code (in python) to solve it.
No comments:
Post a Comment