C. p-binary
题意: 给n 和p 构造多个 (2^x + p) 这样的数的和等于n 问最小多少个这样的二进制数
题解:
所以我们将 枚举t 即可
但是枚举的时候有个坑,有可能当前的二进制值可能用多个
具体看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
ll n, p;
int main()
{
cin >> n >> p;
if(n <= p)
{
cout << -1 << endl;
return 0;
}
ll ans = -1;
ll ji = 0;
ll sum = 0;
for(int i = 1; i < 32; i ++) //枚举 因为1e9 最多是2的32次
{
ll cnt = 0; //这里记录当前sum值 有多少个1 也就是由多少个二进制数组成的
sum = n-p*i; // 根据公式减去
while(sum > 0) // 循环记录有多少个1
{
if(sum&1) cnt ++;
sum >>= 1;
}
if(cnt <= i && i <= n-p*i ) // 这里坑,如果刚好二进制的数刚好
{ // 等于当前枚举的个数的时候
ans = i; // 当如果不等于的时候 我们可以知道
break; // 一个4+p 可以变成2+p+2+p
} // 所以如果当前枚举的个数不全为1的时候就可以, 虽然我觉得可以hack
}
cout << ans << endl;
return 0;
}