题意:给出一个32位整数n和p,求最小使用2的幂的个数,使得n = (2^x1 + p) + (2^x2 + p ) + …
思路:先移项成n - p * i = 2^x1 + 2^x2 + 2^x3;
我们可以知道的是一个数n,如果他的二进制中有k个1,那么我们最小可以用k个2的幂数,最多可以用n个2的幂数累加得到它。
然后1e9的大小是32位不到,这里直接枚举n-p*i 32次,求出第一次满足[k,n]的i。
int main()//移项,找到左边2进制数个数>=右边二进制中的个数
{
int n, p;
while (cin >> n >> p)
{
f(i, 1, 32)
{
int now = n - i * p;//右边
if (now <= 0)break;
bitset<32> a(now);
if (i >= a.count()&&i<=now)
{
cout << i << endl;
return 0;
}
}
puts("-1");
}
return 0;
}