兔子的区间密码

兔子的区间密码

https://ac.nowcoder.com/acm/problem/20860

兔子的区间密码

思路

结论显然,我们从的二进制最高位出发,碰到的第一位不同的数即可得到从这一位向下,所有的二进制数位都可以得到为,因此我们只需要从高位开始枚举即可,然后得到第位是第一个不同位然后即可得到答案。

代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = read();
    while(T--) {
        ll l = read(), r = read();
        int i;
        for(i = 63; i >= 0; i--) if((l >> i) != (r >> i)) break;
        cout << (1ll << i + 1) - 1 << endl;
    }
    return 0;
}
全部评论
是7,没错。去掉最高位后,一个111,一个010(都是二进制表示),二者可以取到7(一个100,一个011就可以了)。
1 回复 分享
发布于 02-03 20:55 山西
哥,你说,区间10到15按理说说异或应该为5把,为啥是7
点赞 回复 分享
发布于 2024-08-15 21:55 湖南

相关推荐

孙艹肘:校招不给三方直接让实习我都去了,,主打一个在学校呆着也是闲着,不如出来实习一下
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务