【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.取沙子游戏

题目大意

1908b1c2-1d4f-4a61-82fb-74c3eda65f6b

思路

分奇偶讨论
在偶数(劣势)情况下选择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.构造大师周三金

题目大意

40790a27-432c-421b-84d3-d62d1d48c89d

思路

显然\(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;
}
posted @ 2025-08-26 19:23  White_ink  阅读(4)  评论(0)    收藏  举报