#44397: python 測資 #6 無法通過求解


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
a810. 1. 倍數關係 -- 102學年度高雄市資訊學科能力競賽複賽 | From: [123.192.228.253] | 發表日期 : 2024-12-02 18:27

我的程式碼貼下面,是我漏掉了什麼沒考慮到嗎?

嘗試各種輸入後都沒找出可能出問題的狀況,但 #6 就是過不去

目前只知道 #6 的 x 或 y 有可能出現 0,但不知道還有什麼情況沒考慮

 

我目前主要考慮的條件有兩種,並根據這兩種情況排列組合出四個 if:

  • a 和 b 同號/異號,或 a 與 b 其中一個為 0
  • x 和 y 有可能是 0,或最大公因數等於 x 或 y

 

# TODO: 當 x 或 y 至少有一個值為 0 且滿足某種未知條件時,將會輸出錯誤結果,找出該狀態並修正
from math import gcd

def lcm(arg1, arg2):
  """取兩個正整數的最小公倍數(for python 3.6)"""
  return arg1 * arg2 // gcd(arg1, arg2)

a, b, x, y = map(int, input().split())

# testing: 驗證答案是否正確用,直接用這行輸出答案穩吃 TLE
# print(f'ans: {len([True for i in range(a, b + 1) if 0 in (x, y) or i % x == 0 or i % y == 0])}')

# 若 x, y 為負,將其轉換成正數,若為 0,則設為 1,並保證 x <= y
x, y = sorted(map(lambda n: abs(n) if n != 0 else 1, (x, y)))

# is_abs: a 和 b 同號或 a 與 b 其中一個為 0
# is_mul: x 是 y 的因數(gcd(x, y) == x)
is_abs, is_mul = a * b >= 0, y % x == 0

if is_abs and is_mul:
  a, b = sorted(map(abs, (a, b)))
    print(abs(b // x - a // x) + (a % x == 0))

elif is_abs and not is_mul:
    print((b // x - a // x + (a % x == 0)) + (b // y - a // y + (a % y == 0)) - (b // lcm(x, y) - a // lcm(x, y) + (a % lcm(x, y) == 0)))

elif not is_abs and is_mul:
    print(abs(a) // x + b // x + 1)

else:   # if not is_abs and not is_mul
  print((abs(a) // x + b // x + 1) + (abs(a) // y + b // y + 1) - (abs(a) // lcm(x, y) + b // lcm(x, y) + 1))

 

我連 python 負數用整除運算子 // 會「向下」取整的特性都考慮進去了

還漏了什麼呢?

 

 
ZeroJudge Forum