题意: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;
}