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; }