可以想想,对于一个数 在什么情况下会对答案产生贡献?假设在二进制下 在 的基础 上产生了 个进位,也就是说 在二进制下第 位都由 变为了 , 而第 位则由 变为了 , 而其他位则不变。那么,也就是说,当 时,会对答案产生贡献。
所以,可以枚举进位个数 , 若 , 则答案会增加。那么会增加多少呢?用排列组合的思想,即在 位下已经确定了 位的数字个数,也就是对于第 位来说,可以 有两种选择:该位为 或者 , 所以这样的数字个数为 。由于题目要求用二进制的形式输出答案,所以在用二进制存储答案的数组的第 设为 即可。
还需注意判断边界,即 或 的情况,若它们满足条件,则各自会产生 的贡献,即答案的第 位增加 。由于第 位可能会增加两个 , 所以要处理下进位。