結果
| 問題 |
No.2756 GCD Teleporter
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-09-14 20:40:20 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,011 bytes |
| コンパイル時間 | 430 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 166,000 KB |
| 最終ジャッジ日時 | 2024-09-14 20:40:38 |
| 合計ジャッジ時間 | 18,513 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 27 WA * 9 |
ソースコード
## https://yukicoder.me/problems/no/1694
from collections import deque
def main():
N = int(input())
A = list(map(int, input().split()))
# osa-k法により素因数分解を実施
max_a = max(A)
min_primes = [i for i in range(max_a + 1)]
for p in range(2, max_a + 1):
if p != min_primes[p]:
continue
x = 2 * p
while x <= max_a:
if min_primes[x] == x:
min_primes[x] = p
x += p
prime_divisors = [[] for _ in range(max_a +1)]
for a0 in range(2, max_a + 1):
a = a0
primes = set()
while min_primes[a] != a:
p = min_primes[a]
primes.add(p)
a //= p
if a > 1:
primes.add(a)
prime_divisors[a0] = primes
# 各i について「連結成分」を計算し、最小の数字を記録
exists_a = [[] for _ in range(max_a + 1)]
for i in range(N):
a = A[i]
exists_a[a].append(i)
composite_id_list = [-1] * N
composite_primes = {}
composite_id = 0
for i in range(N):
if composite_id_list[i] == -1:
queue = deque()
queue.append((i, 0))
composite_id_list[i] = composite_id
while len(queue) > 0:
v, typ = queue.popleft()
if typ == 1:
a = v
else:
a = A[v]
if a == 1:
continue
if typ == 1:
x = a
while x <= max_a:
for w in exists_a[x]:
if composite_id_list[w] == -1:
composite_id_list[w] = composite_id
queue.append((w, 0))
x += a
else:
# typ == 0:
for p in prime_divisors[a]:
if p not in composite_primes:
composite_primes[p] = composite_id
queue.append((p, 1))
composite_id += 1
# 連結成分に所属する数字の中での最小値を計算する
composite_id_map = {}
for i in range(N):
c_id = composite_id_list[i]
if c_id not in composite_id_map:
composite_id_map[c_id] = max_a
for d in prime_divisors[A[i]]:
composite_id_map[c_id] = min(composite_id_map[c_id], d)
# 連結になるように対処する
if len(composite_id_map) == 1:
print(0)
else:
min_answer = float("inf")
for c_id0, a in composite_id_map.items():
if a == 1:
continue
ans = a * (len(composite_id_map) - 1)
min_answer = min(min_answer, ans)
print(min_answer)
# どこかの連結成分に合わせるということをする
if __name__ == "__main__":
main()