题意:n(1 ≤ n ≤ 10000) 组数据,每组一个l, r(0 ≤ li ≤ ri ≤ 10^18),求[l, r]间二进制表示1最多的,最小的数。
题目链接:http://codeforces.com/problemset/problem/484/A
——>>如果 l 与 r 的二进制位数不一样,那么此时应达全1状态近 r。。
如果 l 与 r 的进制数位数一样的时候,从较小数不断加各个位置的 1 ,不超过 r 得到的数就是结果。。
1LL.。。。。。。。
#include <cstdio> int Cal(long long x) { int ret = 0; while (x) { ++ret; x >>= 1; } return ret; } int main() { int n; long long l, r, ret; scanf("%d", &n); while (n--) { scanf("%I64d%I64d", &l, &r); int lcnt = Cal(l); int rcnt = Cal(r); if (lcnt < rcnt) { if (r == (1LL << rcnt) - 1) { ret = r; } else { ret = (1LL << (rcnt - 1)) - 1; } } else { for (int i = 0; i < rcnt; ++i) { if (((1LL << i) | l) <= r) { l |= (1LL << i); } } ret = l; } printf("%I64d\n", ret); } return 0; }