ABC128 C - Switches
解法
スイッチと電球の個数がとても少ないので、番目の電球に対して機能するスイッチの情報、およびどのスイッチを押すか、という状態をどちらもbitを利用して、int型の変数1つで持つことができます。
スイッチを押すパターンは通りで、多くても1024通り程度です。今調べるパターンをとし、このときに全ての電球が付くかどうかを調べ、について全探索すれば、答えを求めることができます。
のパターンのときに、番目の電球が付くかどうかを調べます。
こうなるのは、番目の電球に対して機能するスイッチの状態をとしたときに、と両方で立っているビットの個数を2で割った数が、と一致した場合です。
両方で立っているビットを取り出すのはAND演算を利用すればいいので、となります。
この値について、立っているビットの個数を調べるのも、ビット演算を利用すると効率よく計算できます。
https://www.slideshare.net/KMC_JP/slide-www
Binary Hacks と 64bit popCount 問題 | TAKESAKO @ Yet another Cybozu Labs
popcountという単語をいれていろいろ調べると、記事がたくさんでてくるので参考にするといいです。
ということで、
今つけるスイッチの状態を固定し、番目の電球に対して、の立っているビットの偶奇がと一致していれば、答えが1増えます。これをについて全探索をすると、答えを求めることができます。
感想
昔作成していたにも関わらず、popcount関数を利用したのは初めてでした。
これを5分で実装できたのはうれしいですね!