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