公式
E - 通信モードの切り替え / Switching Communication Modes 解説
by
E - 通信モードの切り替え / Switching Communication Modes 解説
by
sounansya
動作モードを \(1\) つ決め打った時に、その動作モードで \(T_1,T_2,\ldots,T_M\) 全て表現できるかを判定する問題を考えます。決め打った動作モードでは \(i\) 番目の信号機から信号値 \(X_i\) が出せるものとします。
各信号機では信号値 \(0\) または \(X_i\) が出せるので、\(X\) から XOR 基底を作った後にそれらで \(T\) を全て作れるかを判定すれば良いです。
XOR 基底を作るのには noshi 基底が楽です。具体的なアルゴリズムは以下の実装例を参考にしてください。
答えは最大でも \(2^N\) なので、答えを \(10^9+7\) で割る必要はありません。
n, m = map(int, input().split())
v = [-1] * n
w = [-1] * n
for i in range(n):
v[i], w[i] = map(int, input().split())
t = list(map(int, input().split()))
ans = 0
for bi in range(1 << n):
x = []
for i in range(n):
if (bi >> i) & 1:
x.append(v[i])
else:
x.append(w[i])
base = []
for val in x:
for e in base:
val = min(val, val ^ e)
if val != 0:
base.append(val)
ok = True
for val in t:
for e in base:
val = min(val, val ^ e)
ok &= val == 0
ans += ok
print(ans)
投稿日時:
最終更新:
