AtCoder Beginner Contest 269 C問題 Submask
問題
提出解答
問題の概要
以下の条件を全て満たす非負整数 を昇順に全て列挙せよ.
の2進数表記において, 任意の非負整数
で
の
の位が
ならば,
の
の位も
である.
制約
の
進数表記において,
である位の数は
個以下.
解法1
の
の位が
ならば,
の
の位も
でなくてはならない. これから,
の2進数表記において,
である位のみを
において動かせば条件を満たす整数が作れる. また, これによってが条件を満たす整数を全て列挙できる,
よって, の
の位が
であるような
を
とする
. このとき,
において, 各
の位を
にするか
にするかを bit 全探索その方法を列挙することによって, 条件を満たす
を全て列挙することができるので, これを昇順に並び替えれば良い.
計算量は である.
解法2
実は, 以下の疑似アルゴリズムで条件をみたす を降順に全て列挙できる.
(空リスト)
である限り, 以下を繰り返す:
に
を加えたあと,
*1.
に
を加える.
問題文では昇順に列挙することを要求されているので, 反転を忘れないこと.
*1: 非負整数 に対して,
で
の bitwise and を表す