結果
問題 |
No.3270 No Coprime Cycles
|
ユーザー |
![]() |
提出日時 | 2025-08-04 20:42:11 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 633 ms / 2,000 ms |
コード長 | 1,545 bytes |
コンパイル時間 | 323 ms |
コンパイル使用メモリ | 82,336 KB |
実行使用メモリ | 244,160 KB |
最終ジャッジ日時 | 2025-08-18 01:21:11 |
合計ジャッジ時間 | 21,365 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 42 |
ソースコード
import sys class DSU: def __init__(self, n): self.parent = [-1] * n def find(self, x): if self.parent[x] < 0: return x self.parent[x] = self.find(self.parent[x]) return self.parent[x] def merge(self, x, y): x = self.find(x) y = self.find(y) if x == y: return False if self.parent[x] > self.parent[y]: x, y = y, x self.parent[x] += self.parent[y] self.parent[y] = x return True def same(self, x, y): return self.find(x) == self.find(y) M = 1010101 minfactor = [-1] * M def factorize(n): res = [] if n <= 1: return res while n > 1: p = minfactor[n] e = 0 while n % p == 0: n //= p e += 1 res.append((p, e)) return res isprime = [True] * M isprime[0] = isprime[1] = False for p in range(2, M): if isprime[p]: minfactor[p] = p for q in range(p * 2, M, p): isprime[q] = False if minfactor[q] == -1: minfactor[q] = p n = int(sys.stdin.readline()) a_list = list(map(int, sys.stdin.read().split())) edges = [[] for _ in range(M)] ans = 0 for i, a in enumerate(a_list): for p, e in factorize(a): weight = p * e edges[weight].append((i, n + p)) ans += weight dsu = DSU(n + M) for w in range(M - 1, -1, -1): for u, v in edges[w]: if not dsu.same(u, v): dsu.merge(u, v) ans -= w print(ans)