題目鏈接:https://codeforces.com/problemset/problem/1247/C
題意:給你兩個數n和p, 讓你將n分解成最少的二進制位,但是二進制位變成了2^x + p, 例如當n = 24,p = 1時,
思路:不難想到n在二進制分解後絕對不會超過40位,所以對於這麼小的範圍我們就暴力枚舉多少位能夠組成n就行了。
但是有可以重複用某一位的情況,所以還需要記錄一下可以拆分多少位,如果夠的話就說明可以。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls rt << 1
#define rs rt << 1|1
#define mid ((l + r) >> 1)
#define lson l, mid, ls
#define rson mid + 1, r, rs
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;
int main()
{
ll n, p;
cin >> n >> p;
int ans = -1;
for(int i = 1; i <= 40; ++i)
{
ll tmp = n - 1ll * i * p;
int cnt = 0, tot = 0;
if(tmp > 0)
{
for(int j = 40; j >= 0; --j)
{
if(tmp & (1ll << j))
{
++cnt;
if(j > 0)
tot += j - 1;
}
}
if(cnt == i)
{
ans = cnt;
break;
}
else if(cnt < i)
{
if(cnt + tot >= i)
{
ans = i;
break;
}
}
}
}
cout << ans << endl;
return 0;
}