結果
問題 | No.1451 集団登校 |
ユーザー |
|
提出日時 | 2021-04-11 11:57:54 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 889 ms / 2,000 ms |
コード長 | 1,603 bytes |
コンパイル時間 | 93 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 32,256 KB |
最終ジャッジ日時 | 2024-06-27 07:32:30 |
合計ジャッジ時間 | 10,613 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
class UnionFind():def __init__(self, n):self.n = nself.par = [-1] * self.ndef find(self, x):r = xwhile not self.par[r] < 0:r = self.par[r]t = xwhile t != r:m = tt = self.par[t]self.par[m] = rreturn rdef unite(self, x, y):p = self.find(x)q = self.find(y)if p == q:return Noneif self.par[p] >= self.par[q]:p, q = q, pself.par[p] += self.par[q]self.par[q] = pdef same(self, x, y):return self.find(x) == self.find(y)def size(self, x):return -self.par[self.find(x)]#拡張Euclidの互除法def extgcd(a, b, d = 0):g = aif b == 0:x, y = 1, 0else:x, y, g = extgcd(b, a % b)x, y = y, x - a // b * yreturn x, y, g#mod p における逆元def invmod(a, p):x, y, g = extgcd(a, p)x %= preturn xmod = 10 ** 9 + 7n, m = map(int, input().split())UF = UnionFind(n)g = [[i] for i in range(n)]ans = [1] * ninv2 = invmod(2, mod)for _ in range(m):a, b = map(int, input().split())a -= 1; b -= 1if UF.same(a, b):continueif UF.size(a) > UF.size(b):a, b = b, apa, pb = UF.find(a), UF.find(b)if UF.size(a) < UF.size(b):for i in g[pa]:ans[i] = 0else:for i in g[pa]:g[pb].append(i)for i in g[pb]:ans[i] *= inv2ans[i] %= modUF.unite(a, b)for i in ans: print(i)