結果
問題 | No.2236 Lights Out On Simple Graph |
ユーザー |
|
提出日時 | 2023-03-03 22:45:45 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,624 bytes |
コンパイル時間 | 319 ms |
コンパイル使用メモリ | 82,208 KB |
実行使用メモリ | 77,856 KB |
最終ジャッジ日時 | 2024-09-17 23:55:30 |
合計ジャッジ時間 | 155,701 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 56 WA * 1 |
ソースコード
import sysfrom collections import deque, Counterinput = lambda: sys.stdin.readline().rstrip()ii = lambda: int(input())mi = lambda: map(int, input().split())li = lambda: list(mi())inf = 2 ** 63 - 1mod = 2class matrix():r = 1c = 1A = Nonemod = 2def __init__(self, r, c, mod = 2):self.r = rself.c = cself.A = [[0] * self.c for _ in range(self.r)]if mod is not None:self.mod = moddef makeone(r = 1):A = matrix(r, r, mod)for i in range(r):A[i, i] = 1return Adef __getitem__(self, key):rnow, cnow = keyreturn self.A[rnow][cnow]def __setitem__(self, key, value):rnow, cnow = keyself.A[rnow][cnow] = valuedef __add__(self, other):assert self.r == other.r and self.c == other.cret = matrix(self.r, self.c)for i in range(self.r):for j in range(self.c):ret[i, j] = self[i, j] + other[i, j]ret[i, j] %= self.modreturn retdef __sub__(self, other):assert self.r == other.r and self.c == other.cret = matrix(self.r, self.c)for i in range(self.r):for j in range(self.c):ret[i, j] = self[i, j] - other[i, j]ret[i, j] %= self.modreturn retdef __mul__(self, other):assert self.c == other.rret = matrix(self.r, other.c)for i in range(self.r):for j in range(self.c):for k in range(other.c):ret[i, k] += self[i, j] * other[j, k]ret[i, k] %= self.modreturn retdef augment(self, other):assert self.r == other.rX = matrix(self.r, self.c + other.c, mod = self.mod)for i in range(self.r):for j in range(self.c):X[i, j] = self[i, j]for j in range(other.c):X[i, j + self.c] = other[i, j]return Xdef diminish(self, c):X = []for i in range(self.r):X.append((self.A[i][:c]))return matrix(self.r, c, mod = self.mod, A = X)def hakidashi(self):for i in range(self.c):for j in range(i + 1, self.r):if self.A[j][i] != 0:for k in range(self.c):self.A[j][k], self.A[i][k] = self.A[i][k], self.A[j][k]breakfor i in range(self.r):for j in range(self.c):if self[i, j] != 0:breakelse:continueK = pow(self[i, j], self.mod - 2, self.mod)for to in range(self.c):self[i, to] *= Kself[i, to] %= self.modfor i2 in range(self.r):if i == i2:continuetime = self[i2, j]for j2 in range(self.c):self[i2, j2] -= time * self[i, j2]self[i2, j2] %= self.modreturn selfdef inv(self):assert self.c == self.rone = matrix.makeone(r = self.r)new = self.augment(one)new.hakidashi()for i in range(self.r):for j in range(self.c):if i == j:if new[i, j] != 1:return 0, newelse:if new[i, j] != 0:return 0, newX = matrix(self.r, self.c)for i in range(self.r):for j in range(self.c):X[i, j] = new[i, j + self.c]return 1, Xdef lineareq(self, b):assert self.r == b.rassert b.c == 1Y = self.augment(b)Y = Y.hakidashi()B = [[0] * self.c for _ in range(self.c)]ans = [0] * self.cflag = [0] * self.cfor i in range(self.r):j = 0while j < self.c and Y[i, j] == 0:j += 1if j == self.c:if Y[i, -1] != 0:return None, Nonecontinueflag[j] = 1ans[j] = Y[i, -1]for k in range(j + 1, self.c):if Y[i, k] % self.mod != 0:B[k][j] = (-Y[i, k])% self.modflag[k] = -1for i in range(self.c):if flag[i] != 1:B[i][i] = 1B=[B[i] for i in range(self.c) if flag[i] != 1]return ans,Bdef print(self):for v in self.A:print(*v)import sysinput = lambda: sys.stdin.readline().rstrip()ii = lambda: int(input())mi = lambda: map(int, input().split())li = lambda: list(mi())INF = 2 ** 63 - 1mod = 2n, m = mi()EDGE = [[v - 1 for v in li()] for _ in range(m)]graph = [[] for _ in range(n)]for u, v in EDGE:graph[u].append(v)graph[v].append(u)c = li()A = matrix(n, m)B = matrix(n, 1)for i, V in enumerate(EDGE):u, v = VA[u, i] = 1A[v, i] = 1for i in range(n):if c[i] == 1:B[i, 0] = 1X, Y = A.lineareq(B)if X is None:print(-1)exit()ans = X.count(1)if Y:import randomimport timet1 = time.time()while time.time() - t1 < 3.2:p = random.randint(0, len(Y) - 1)for i in range(m):X[i] ^= Y[p][i]if ans > X.count(1):ans = min(ans, X.count(1))print(ans)