#4356. 子集掩码(Submask)

子集掩码(Submask)

题目描述

给定一个非负整数 NN。请按升序输出所有满足以下条件的非负整数 xx

  • xx 的二进制表示中包含 11 的位置集合是 NN 的二进制表示中包含 1 的位置集合的子集。
  • 换句话说,对于每个非负整数 kk,如果 xx 从低到高第 kk 位是 11,那么 NN 从低到高第 kk 位也必须是 11

输入格式

输入整数NN

输出格式

按升序输出满足条件的所有整数,每个整数占一行。

样例

11
0
1
2
3
8
9
10
11
0
0
576461302059761664
0
524288
549755813888
549756338176
576460752303423488
576460752303947776
576461302059237376
576461302059761664

样例解释

【样例1说明】
N=11(10)=1011(2)N = 11_{(10)} = 1011_{(2)}
满足条件的整数 xx 有:

  1. 0000(2)=0(10)0000_{(2)}=0_{(10)}

  2. 0001(2)=1(10)0001_{(2)}=1_{(10)}

  3. 0010(2)=2(10)0010_{(2)}=2_{(10)}

  4. 0011(2)=3(10)0011_{(2)}=3_{(10)}

  5. 1000(2)=8(10)1000_{(2)}=8_{(10)}

  6. 1001(2)=9(10)1001_{(2)}=9_{(10)}

  7. 1010(2)=10(10)1010_{(2)}=10_{(10)}

  8. 1011(2)=11(10)1011_{(2)}=11_{(10)}

【样例3说明】
注意答案可能不适合3232位整数类型。

数据范围

NN 是整数
0N<2600 \le N < 2^{60}
NN 的二进制表示中最多有 1515 个位置包含 11

来源

  • AtCoder ABC269C