2 条题解

  • 2
    @ 2025-11-24 10:48:13
    int l, r;
        cin >> l >> r;
        vector<int> ai(79), bi(79);
        for(int i = 0;i <= 63; i++)
        {
            ai[i] = l & 1 << i;
            bi[i] = r & 1 << i;
    //1 << i是2的i次方 此时ai为l的二进制 ,bi是r的二进制
        }
        int ans = 0;
        for(int i = 63;i >= 0; i--)
        {
            if(ai[i] != bi[i])  break;
    //从高位往低位找不相同的位置终止,加上前面的值
            ans += ai[i];
        }
        cout << ans << "\n";
    
    • @ 2025-11-24 10:48:53

      从l遍历到r时,只需将前高位相同值相加得出答案。

    • @ 2025-11-26 18:41:35

      wow❤️ @

  • 0
    @ 2025-11-30 10:29:34

    //写0到15的二进制观察得 如果是2的0次方这一位 这个位上的数每2的0次方改变一次 即0 1 0 1 0 1 , 2的1次方每2次改变一次 即0 0 1 1 0 0 1 1 //其他位同理 我们只要找出l,r除以这个位的次方 看它们是在第几次改变 如果都在同一次改变 那l到r这个位均为同一个数 //并且是奇数次改变的时候 因为奇数次改变 这个位都是1 如果不在同一次则必定同时包含不同0和1 不能是按位与结果为1

    #include <iostream>

    using namespace std;

    #define ll long long

    int main()

    {

    ll l,r;

    cin>>l>>r;

    ll ans=0;

    ll num=1;

    while(r/num>0)//遍历每一位

    {

    if(l/num==r/num&&l/num%2!=0)//在同一次改 变 并且是奇数次改变

    {

    ans+=num;//符合按位与结果位1 累加答案

    }

    num=num*2;

    }

    cout<<ans<<endl;

    return 0;

    }

    • 1

    信息

    ID
    1211
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    71
    已通过
    12
    上传者