兔子的区间密码
思路
结论显然,我们从的二进制最高位出发,碰到的第一位不同的数即可得到从这一位向下,所有的二进制数位都可以得到为,因此我们只需要从高位开始枚举即可,然后得到第位是第一个不同位然后即可得到答案。
代码
#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; }