結果

問題 No.803 Very Limited Xor Subset
ユーザー shotoyoo
提出日時 2020-11-22 15:13:02
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 137 ms / 2,000 ms
コード長 3,095 bytes
コンパイル時間 234 ms
コンパイル使用メモリ 82,516 KB
実行使用メモリ 78,120 KB
最終ジャッジ日時 2024-07-23 16:32:58
合計ジャッジ時間 6,289 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 43
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import sys
input = lambda : sys.stdin.readline().rstrip()
sys.setrecursionlimit(max(1000, 10**9))
write = lambda x: sys.stdout.write(x+"\n")
"""
1rank
"""
class BitMatrix:
def __init__(self, h, w, v=None):
self.h = h
self.w = w
self.l = [0]*h
if v is not None:
for i in range(h):
for j in range(w):
if v[i][j]:
self.l[i] |= (1<<j)
def to_matrix(self):
M = []
for i in range(self.h):
l = []
for j in range(self.w):
l.append(self.l[i]>>j&1)
M.append(l)
return M
def swap(self, i, j):
"""ij
"""
self.l[i], self.l[j] = self.l[j], self.l[i]
def __getitem__(self, args):
if not hasattr(args, "__getitem__"):
return self.l[args]
else:
assert args[1]<self.w
return (self.l[args[0]]>>args[1])&1
def __setitem__(self, args, v):
if not hasattr(args, "__getitem__"):
self.l[args] = v
else:
assert args[1]<self.w
if v:
self.l[args[0]] |= (1<<args[1])
elif self.l[args[0]]>>args[1]&1:
self.l[args[0]] -= (1<<args[1])
def GaussJordan(A, is_extended=False):
"""A: BitMatrix (H*W)
"""
rank = 0
H = A.h
W = A.w
ww = W if not is_extended else W-1
for col in range(ww):
pivot = -1
for row in range(rank, H):
if A[row,col]:
pivot = row
break
if pivot==-1:
continue
# A[pivot], A[rank] = A[rank], A[pivot]
A.swap(pivot, rank)
for row in range(H):
if (row!=rank and A[row,col]):
val = A[row] ^ A[rank]
A[row] = val
rank += 1
return rank
def solve(A, b):
"""A: Matrix (m*n), b: array (n*1)
resrank
None,-1
"""
if isinstance(A, list):
A = BitMatrix(len(A), len(A[0]), A)
m = A.h
n = A.w
M = BitMatrix(m,n+1)
for i in range(m):
for j in range(n):
M[i,j] = A[i,j]
M[i,n] = b[i]
rank = GaussJordan(M, True)
for row in range(rank, m):
if M[row,n]:
#
return None, -1
res = [0]*n
for i in range(rank):
res[i] = M[i,n]
return res, rank
n,m,x = list(map(int, input().split()))
a = list(map(int, input().split()))
A = []
b = []
mm = max(x, max(a))
# d = mm.bit_length()
d = 32
for i in range(d):
tmp = []
for j in range(n):
tmp.append((a[j]>>i)&1)
A.append(tmp)
b.append((x>>i)&1)
for i in range(m):
tmp = []
t,l,r = map(int, input().split())
tmp = [0]*(l-1) + [1]*(r-l+1) + [0]*(n-r)
A.append(tmp)
b.append(t)
res, rank = solve(A, b)
if rank==-1:
ans = 0
else:
M = 10**9+7
ans = pow(2, n-rank, M)
print(ans)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0