公式

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\) で割る必要はありません。

実装例(Python3)

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)

投稿日時:
最終更新: