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
看了我的代码,自己对照模拟下就知道思路了:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
__int64 bit[65];
int main() {
bit[0]=1;
for(int i = 1; i <= 63; i++) {
bit[i] = 2*bit[i-1];
}
int n;
scanf("%d",&n);
while(n--) {
__int64 l,r;
scanf("%I64d%I64d",&l,&r);
int j;
__int64 sum = 0;
for(j = 0; sum <=r; j++)
{
sum += bit[j];
}
j--;
while(sum > r)
{
sum -= bit[j];
if(sum < l) sum += bit[j];
j--;
}
printf("%I64d\n",sum);
}
return 0;
}