結果
| 問題 | No.1059 素敵な集合 |
| コンテスト | |
| ユーザー |
simamumu
|
| 提出日時 | 2020-05-22 21:47:03 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 159 ms / 2,000 ms |
| コード長 | 1,335 bytes |
| コンパイル時間 | 139 ms |
| コンパイル使用メモリ | 82,288 KB |
| 実行使用メモリ | 85,388 KB |
| 最終ジャッジ日時 | 2024-07-23 09:27:30 |
| 合計ジャッジ時間 | 3,262 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
L, R = map(int, input().split())
S = list(range(L, R + 1))
class UnionFind:
def __init__(self, N): # 頂点数 N
self.table = [i for i in range(N)] # 親 table[x] == x で根
self.rank = [1 for i in range(N)] # 木の長さ
self.size = [1 for i in range(N)] # 集合のサイズ
def Find(self, x): # xの根を返す
if self.table[x] == x:
return x
else:
self.table[x] = self.Find(self.table[x]) # 親の更新
self.size[x] = self.size[self.table[x]]
return self.table[x]
def Unite(self, x, y):
x, y = self.Find(x), self.Find(y)
sx, sy = self.Size(x), self.Size(y)
if x == y:
return
if self.rank[x] > self.rank[y]:
self.table[y] = x
self.size[x] = sx + sy
else:
self.table[x] = y
self.size[y] = sx + sy
if self.rank[x] == self.rank[y]:
self.rank[y] += 1
def Check(self, x, y):
return self.Find(x) == self.Find(y)
def Size(self, x):
return self.size[self.Find(x)]
N = R - L + 1
UF = UnionFind(N)
for s in S:
n = 2
while n * s <= R:
UF.Unite(s - L, n * s - L)
n += 1
S = set()
for i in range(N):
S.add(UF.Find(i))
print(len(S) - 1)
simamumu