日期:2025年9月20日
ZeroJudge 題目連結:e293. 花開花落,雨初臨
解題想法
這題的題目敘述根本就是在寫小說,重點只有「要找出給定的數字在 100 以內的質因數」。解題時要先建表 primes,列出 0 到 100 之間的質數,只有 25 個,直接打進程式碼就好。接下來計算這些質數相乘的結果 pq,假設要檢查的數字為 $m$,如果 $s = gcd(m, pq)$ 等於 1,則 $m$ 在 0 到 100 之間沒有質因數;反之,從 primes 之中依序取出質數 prime,檢查 prime 是否為 s 的因數即可。不過這題的輸出最大會到 5000 位,要用大數運算,所以我只有用 Python 解題。
Python 程式碼
使用時間約為 0.7 s,記憶體約為 29.3 MB,通過測試。
import sys, math
# 建表,2 ~ 100 之間的質數
primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97}
# pq,2 ~ 100 所有的質數相乘
pq = 1
for prime in primes: pq *= prime
# 主要的解題過程
result = [] # 儲存結果用的空串列
lines = sys.stdin.readlines()
for line in lines[1:]:
m = int(line) # 轉成整數 m
res = [] # 儲存 m 的答案用的空串列
s = math.gcd(m, pq)
if s == 1: # m 在 0 到 100 之間沒有質因數
result.append("Terrible Silence...\n")
else:
for prime in primes: # 依序由 primes 中取出質數,檢查是否為 s 的因數
if s%prime == 0: # 如果 prime 是因數
res.append(f"{prime:d}") # prime 轉成字串加入 res
result.append(" ".join(res) + "\n")
sys.stdout.write("".join(result))
沒有留言:
張貼留言