专栏文章

题解:P14074 [GESP202509 五级] 有趣的数字和

P14074题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minqn6ve
此快照首次捕获于
2025/12/02 06:46
3 个月前
此快照最后确认于
2025/12/02 06:46
3 个月前
查看原文

第一种做法

直接拆分,但每次除 2 不现实,也就是while(x>>=1)的做法会超时,那么,考虑 lowbitlowbit
lowbit(x)lowbit(x) 即返回 xx 的离末尾最近的 1 所代表的值。 得出代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x){return x&(-x)}
int chai(int x)
{
    int num=0;
    while(x-=lowbit(x))
    {
        num++;
    }
    return num;
}
int main(  )
{
    int l,r;
    cin>>l>>r;
    long long sum=0;
    for(int i=l;i<=r;i++) if(chai(i)%2==0) sum+=i;
    cout<<sum;
    return 0;
}
但是任然不对。

第二种做法

这里介绍一个可以在 O(1)O(1) 时间复杂度直接返回一个数二进制一的个数的函数:__builtin_popcount(x)\_\_builtin\_popcount(x)
那么,很容易得出代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int main(  )
{
    int l,r;
    cin>>l>>r;
    long long sum=0;
    for(int i=l;i<=r;i++) if(__builtin_popcount(i)%2==1) sum+=i;
    cout<<sum;
    return 0;
}
感谢观看!

评论

0 条评论,欢迎与作者交流。

正在加载评论...