Python程式:查詢能被a、b、c整除的序列的第n項
假設我們有四個數字n、a、b和c。我們需要找到能被a、b或c整除的已排序數字序列的第n項(從0開始計數)。
例如,如果輸入為n = 8,a = 3,b = 7,c = 9,則輸出為18,因為該序列的前9項為[1, 3, 6, 7, 9, 12, 14, 15, 18]。
為了解決這個問題,我們將遵循以下步驟:
- 如果a、b、c中的最小值為1,則
- 返回n
- ab := lcm(a, b),bc := lcm(b, c),ca := lcm(a, c)
- abc := lcm(ab, c)
- left := 1,right := 10^9
- 當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
- 如果numterms > n,則
- right := mid - 1
- 否則,如果numterms < n,則
- left := mid + 1
- 否則,
- 返回 mid - min(mid mod a, mid mod b, mid mod c)
- 返回 -1
示例 (Python)
讓我們來看下面的實現,以便更好地理解:
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))
輸入
8, 3, 7, 9
輸出
18
廣告