【lowbit】
【lowbit】
概念
\(lowbit(x)\):x的二进制表达式中 最低位的1 所对应的值
【性质】
可以整除n的最大2的幂次\(2^{i}\)
i64 lowbit(i64 x){
return (x&-x);
}
常见运用:统计二进制下1的个数
while(x){
x-=x&-x;
ans++;
}
【思维/构造题运用】
[2024CCPC Online]K.取沙子游戏
题目大意
思路
分奇偶讨论
在偶数(劣势)情况下选择lowbit
(1)奇数情况下,每次A都可以选择奇数,迫使B只能选奇数
而由于该情况下剩余的沙子一定是偶数->B一定取不完->A必赢
(2)偶数情况下:双方肯定都会选择偶数抛给对方->拼谁能先\(\leq k\)
->不妨考虑先手拿lowbit,之后模仿后手拿
代码
int n,k;
void solve(){
cin>>n>>k;
if(n<=k){
cout<<"Alice"<<endl;
return;
}
if(n%2==0){
if((n&-n)>k) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
else{
cout<<"Alice"<<endl;
}
}
[2025FJCPC]J.构造大师周三金
题目大意
思路
显然\(2^{2i}\)一定是完全平方数
※考虑lowbit性质:可以整除n的最大2的幂次
那么每次加上当前lowbit
->构造为\((100...000)_2\)的东西
代码
i64 n;
void solve(){
cin>>n;
vector<i64> ans;
for(int i=1;i<=100;i++){
i64 c=sqrtl(n);
if(c*c==n) break;
ans.push_back((n&-n));
n+=(n&-n);
}
int a=ans.size();
cout<<a<<endl;
for(auto son:ans) cout<<son<<" ";
cout<<endl;
}