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.
Output
For each query print the answer in a separate line.
Note
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又要是最多的,所以可以想到从左端点用一个1从右往左加,直到构造出一个比r大的为止。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long n,l,r;
int main()
{
long long k,p=1;
scanf("%I64d",&n);
while (n--)
{
p=1;
scanf("%I64d%I64d",&l,&r);
if (l==r)
{
printf("%I64d\n",l);
continue;
}
while (l<=r)
{
k=l | p;
if (k>r) break;
l=k;
p<<=1;
}
printf("%I64d\n",l);
}
return 0;
}
|