https://www.luogu.org/problem/P1582
#include<bits/stdc++.h>
using namespace std;
long long N,K,x,ans,k;
bool a;
int main() {
cin>>N>>K;
for(register int i=N; i>0;) { // register关键字请求让编译器将变量a直接放入寄存器里面,以提高读取速度
if(i%2==1) {
x++;
}
i>>=1; //二进制下为除去最后一位,十进制下为除以2
}
if(x<=K) {
cout<<0<<endl;
return 0; //如果此时最终合并的数目就小于等于K,则不用买,直接输出
}
for(register int j=1;;) {
k=0;
x=0;
a=false;
for(register int i=N+j; i>0;) {
if(i%2==1) {
x++;
a=true;
}
if(a==false&&i%2==0) { //二进制下从右向左寻找第一个1 位置
k++;
}
i>>=1; //除去二进制最后一位 或者在十进制下除以2
}
if(x<=K) { //如果加1之后最终合并的个数x小于K 则直接输出j
ans=j;
break;
} //假设二进制下从右向左第一位就是1,那么就不会进入第二个if,然后一直循环,算出1
//的数量,然后判断是否小于K,如果不满足,就在第一位,即第一个1的位置让他再加1,这是二进制下的加,要换算成十进制
j=j+pow(2,k); //如果不行,二进制下自加一个1,直到成立 然后进入一下次循环,首先清零,寻找第一个1的位置
}
cout<<ans<<endl;
return 0;
}
知识兔