设我们枚举的系数为 k,题目等价于判断 n−k×p 能否被拆成 k 个 2 的次方数之和。结论是需满足 pop_count(n−k×p)≤k≤n−k×p。那么这段区间内的取值一定都能被取到吗?
首先下界是显然的。将 n−k×p 写成二进制形式,记其中为 1 的位数总数为 pop_count(n−k×p),那么你至少需要这么多个二进制数相加。
那么如果这些数不够多怎么办?我们任选其中一个二进制数 2x,将其拆作 2x−1+2x−1,就可以使数的总数增加 1。但我们不能无限地拆下去,当且仅当我们把这些数都拆成了 1,总共 n−k×p 个 1 时,不能继续拆下去了。故上界为 n−k×p,并且区间的取值是连续的。