P1582 倒水(洛谷)
程序员文章站
2022-03-13 16:59:42
...
只要求出的n转为二进制下,有k个1即可。
lowbit(n)取出非负整数n在二进制表示下最低位的1以及它后边的0构成的数值。
__builtin_popcountll(n)求出非负整数n在二进制表示下有几个1。
让n一直加lowbit(n),进位减少二进制表示下1的个数。
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll n,k,sum;
scanf("%lld %lld",&n,&k);
sum=n;
while(__builtin_popcountll(sum)>k){
sum+=sum&-sum;
}
printf("%lld\n",sum-n);
return 0;
}
下一篇: 洛谷·付公主的背包