結果
問題 | No.803 Very Limited Xor Subset |
ユーザー |
![]() |
提出日時 | 2020-04-14 22:22:09 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 519 ms / 2,000 ms |
コード長 | 1,539 bytes |
コンパイル時間 | 287 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 44,108 KB |
最終ジャッジ日時 | 2024-10-01 18:16:35 |
合計ジャッジ時間 | 25,253 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 43 |
ソースコード
import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesimport numpy as npN, M, X = map(int, readline().split())A = list(map(int, readline().split())) + [0]A = [0] + [x ^ y for x, y in zip(A, A[1:])]m = map(int, read().split())graph = [[] for _ in range(N + 1)]for t, x, y in zip(m, m, m):x -= 1graph[x].append((y, t))graph[y].append((x, t))C = [0] * (N + 1)root = [-1] * (N + 1)is_ng = Falsefor v in range(N + 1):if root[v] != -1:continuestack = [v]root[v] = vwhile stack:v = stack.pop()for w, x in graph[v]:if root[w] == -1:root[w] = root[v]C[w] = C[v] ^ xstack.append(w)continueif C[w] != C[v] ^ x:is_ng = Trueif is_ng:print(0)exit()for v in range(N + 1):X ^= C[v] * A[v]if v != root[v]:A[root[v]] ^= A[v]def row_transform_over_F2(A, highest=60):for k in range(highest, -1, -1):I = np.where((A >> k) == 1)[0]if len(I) == 0:continuei = I[0]x = A[i]A ^= ((A >> k) & 1) * xA[i] = xnums = np.array([A[v] for v in range(N + 1) if v == root[v] != 0], np.int32)row_transform_over_F2(nums, 31)nums.sort()nums = nums[::-1]for x in nums:if x <= X:X ^= xif X != 0:print(0)else:MOD = 10 ** 9 + 7free = int(np.sum(nums == 0))print(pow(2, free, MOD))