Let's denote as the number of bits set ('1' bits) in the binary representation of the non-negative integer x.
You are given multiple queries consisting of pairs of integers l and r. For each query, find the x, such that l ≤ x ≤ r, and is maximum possible. If there are multiple such numbers find the smallest of them.
The first line contains integer n — the number of queries (1 ≤ n ≤ 10000).
Each of the following n lines contain two integers li, ri — the arguments for the corresponding query (0 ≤ li ≤ ri ≤ 1018).
For each query print the answer in a separate line.
3 1 2 2 4 1 10
1 3 7
The binary representations of numbers from 1 to 10 are listed below:
110 = 12
210 = 102
310 = 112
410 = 1002
510 = 1012
610 = 1102
710 = 1112
810 = 10002
910 = 10012
1010 = 10102
数学题。感觉这个题还是蛮巧妙的,将问题不断地转化成子问题求解。
1.当L和R位数不齐的时候:
R | 1 | 1 | 0 | 0 | 1 | 1 |
L | 1 | 1 | 0 | 1 |
那么最优解必然是比R位数少一个,每位都是1的数。(特殊的,当R本身就是111...11的时候,最优解就是R本身)
R | 1 | 1 | 0 | 0 | 1 | 1 |
解 | 1 | 1 | 1 | 1 | 1 | |
L | 1 | 1 | 0 | 1 |
2.如果R和L的位数相等。
R | 1 | 1 | 1 | 0 | 1 | 1 |
解 | 1 | 1 | …… | …… | …… | …… |
L | 1 | 1 | 0 | 1 | 0 | 1 |
需要确定的位数仅仅是打省略号的部分。(因为如果解不是以11开头的数,那么必然不在[L,R]范围内。)
问题又转换成了第1种情况——L和R位数不齐的时候,求L=101,R=1011的最优解。
#include<cstdio>
using namespace std;
typedef long long LL;
inline LL calculate(LL L,LL R)
{
for(int i=60;i>=0;i--)
{
LL p = (1LL) << i;
if(L<=p-1 && p-1<=R) return p-1;
if(p<=L) return p + calculate(L-p,R-p);
}
}
int main()
{
int T; scanf("%d",&T);
for(int i=1;i<=T;i++)
{
LL l,r; scanf("%I64d%I64d",&l,&r);
printf("%I64d\n",calculate(l,r) );
}
return 0;
}