結果
問題 | No.803 Very Limited Xor Subset |
ユーザー |
|
提出日時 | 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 |
ソースコード
import sysinput = lambda : sys.stdin.readline().rstrip()sys.setrecursionlimit(max(1000, 10**9))write = lambda x: sys.stdout.write(x+"\n")"""ビット行列1次方程式、ランクrank"""class BitMatrix:def __init__(self, h, w, v=None):self.h = hself.w = wself.l = [0]*hif 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 Mdef swap(self, i, j):"""i行目とj行目のスワップ"""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.wreturn (self.l[args[0]]>>args[1])&1def __setitem__(self, args, v):if not hasattr(args, "__getitem__"):self.l[args] = velse:assert args[1]<self.wif 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 = 0H = A.hW = A.www = W if not is_extended else W-1for col in range(ww):pivot = -1for row in range(rank, H):if A[row,col]:pivot = rowbreakif 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] = valrank += 1return rankdef solve(A, b):"""A: Matrix (m*n), b: array (n*1)解がある場合、そのひとつresと解区間の次元rankを返すない場合はNone,-1を返す"""if isinstance(A, list):A = BitMatrix(len(A), len(A[0]), A)m = A.hn = A.wM = 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, -1res = [0]*nfor i in range(rank):res[i] = M[i,n]return res, rankn,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 = 32for 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 = 0else:M = 10**9+7ans = pow(2, n-rank, M)print(ans)