問題
考えたこと
- 問題文が異常に難解なのと入力パターンも難解
- とりあえず全てのスイッチのパターン試す必要がありそう
- 制約が小さいため
bit全探索
が頭をよぎる
- 途中で 配列同士のand演算を使いたかったので numpy も使用する
実装
import numpy as np
n, m = [int(x) for x in input().split()]
k_l = []
for i in range(m):
l = [0 for x in range(n)]
for i, number in enumerate(input().split()):
if i == 0:
continue
l[int(number)-1] = 1
l = np.array(l)
k_l.append(l)
on = [int(x) for x in input().split()]
def solve(l, check):
ans = sum(l & check) % 2
return ans
ans = 0
for x in range(2**n):
check = [0 for x in range(n)]
for y in range(n):
if x >> y & 1 == 1:
check[y] = 1
check = np.array(check)
add = 1
for i, l in enumerate(k_l):
if on[i] != solve(l, check):
add = 0
break
ans += add
print(ans)
結果
- クソバグを一件出してしまったが, 基本的な方針は正解
- 無事に問題を見つけて
AC
できた
- 割とこの手の問題は力技感があって好き