Program to find nth term of a sequence which are divisible by a, b, c in Python

PythonServer Side ProgrammingProgramming

Suppose we have four numbers n, a, b, and c. We have to find the nth (0 indexed) term of the sorted sequence of numbers divisible by a, b or c.

So, if the input is like n = 8 a = 3 b = 7 c = 9, then the output will be 18, as The first 9 terms of the sequence are [1, 3, 6, 7, 9, 12, 14, 15, 18].

To solve this, we will follow these steps −

  • if minimum of a, b, c is same as 1, then
    • return n
  • ab := lcm(a, b), bc := lcm(b, c), ca := lcm(a, c)
  • abc := lcm(ab, c)
  • left := 1, right := 10^9
  • while left <= right, do
    • mid :=(left + right) / 2
    • na := quotient of mid / a
    • nb := quotient of mid / b
    • nc := quotient of mid / c
    • nab := quotient of mid / ab
    • nbc := quotient of mid / bc
    • nca := quotient of mid / ca
    • nabc := quotient of mid / abc
    • numterms := na + nb + nc - nab - nbc - nca + nabc
    • if numterms > n, then
      • right := mid - 1
    • otherwise when numterms < n, then
      • left := mid + 1
    • otherwise,
      • return mid - minimum of (mid mod a, mid mod b, mid mod c)
  • return -1

Example (Python)

Let us see the following implementation to get better understanding −

import math
def lcm(a, b):
   return (a * b) // math.gcd(a, b)
class Solution:
   def solve(self, n, a, b, c):
      if min(a, b, c) == 1:
         return n
      ab, bc, ca = lcm(a, b), lcm(b, c), lcm(a, c)
      abc = lcm(ab, c)
      left, right = 1, 10 ** 9
      while left <= right:
         mid = (left + right) // 2
         na = mid // a
         nb = mid // b
         nc = mid // c
         nab = mid // ab
         nbc = mid // bc
         nca = mid // ca
         nabc = mid // abc
         numterms = na + nb + nc - nab - nbc - nca + nabc
         if numterms > n:
            right = mid - 1
         elif numterms < n:
            left = mid + 1
         else:
            return mid - min(mid % a, mid % b, mid % c)
      return -1
ob = Solution()
n = 8
a = 3
b = 7
c = 9
print(ob.solve(n, a, b, c))

Input

8, 3, 7, 9

Output

18
raja
Published on 12-Dec-2020 09:17:05
Advertisements