結果
| 問題 | No.2756 GCD Teleporter |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-21 11:39:22 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,664 bytes |
| 記録 | |
| コンパイル時間 | 2,018 ms |
| コンパイル使用メモリ | 95,464 KB |
| 実行使用メモリ | 273,208 KB |
| 最終ジャッジ日時 | 2026-07-21 11:39:37 |
| 合計ジャッジ時間 | 12,404 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 35 RE * 1 |
ソースコード
# Varified
# https://judge.yosupo.jp/submission/314547
# https://atcoder.jp/contests/abc350/submissions/70012959
# https://atcoder.jp/contests/abc333/submissions/70015327
class UnionFind:
def __init__(self,N):
self.parent = [-1]*N
self.groupcount = N
def union(self,x,y):
fx = self.find(x)
fy = self.find(y)
if fx != fy: # x,y の属する木が異なる
self.groupcount -= 1
if self.parent[fx] <= self.parent[fy]: # xの木のサイズ >= yの木のサイズ
self.parent[fx] += self.parent[fy]
self.parent[fy] = fx
else:
self.parent[fy] += self.parent[fx]
self.parent[fx] = fy
def find(self,x):
f = x
stack = []
while self.parent[f] >= 0:
stack.append(f)
f = self.parent[f]
for s in stack:
self.parent[s] = f
return f
def size(self,x):
return -self.parent[self.find(x)]
def same(self,x,y):
return self.find(x) == self.find(y)
def groups(self):
A = sorted(set(self.find(i) for i in range(len(self.parent))))
d = {v:i for i,v in enumerate(A)}
res = [[] for i in range(len(A))]
for i in range(len(self.parent)):
res[d[self.find(i)]].append(i)
return res
def groupsizes(self):
return [len(g) for g in self.groups()]
# ======================================
from collections import defaultdict
N = int(input())
A = list(map(int,input().split()))
M = max(A)
mpf = [i for i in range(M+1)]
for i in range(2,M+1):
if mpf[i] == i:
for j in range(2*i, M+1,i):
mpf[j] = i
d = defaultdict(set)
for i,a in enumerate(A):
while a > 1:
p = mpf[a]
a //= p
d[p].add(i)
UF = UnionFind(N)
for _,arr in d.items():
l = len(arr)
r = arr.pop()
for v in arr:
UF.union(r, v)
if UF.groupcount == 1:
ans = 0
elif 2 in d:
ans = 2 * (UF.groupcount - 1)
elif 3 in d:
ans = min(2*UF.groupcount, 3*(UF.groupcount-1))
print(ans)
"""
if 連結成分がただ1である:
-> 何もしなくてよい
else:
if 2の倍数が所属する連結成分がある:
if 3の倍数が所属する連結成分がある:
if 2の倍数と3の倍数が同じ連結成分に属する:
-> 2の倍数以外を全部2倍する
else:
-> 2の倍数以外を全部2倍する
else:
-> 2の倍数以外を全部2倍する
else:
if 3の倍数が所属する連結成分がある:
if 3の倍数が所属しない連結成分の個数がただ1つである:
-> 3の倍数が所属しない連結成分を3倍する
else:
-> 全部の連結成分を2倍する
else:
-> 全部の連結成分を2倍する
"""