CF 276 Div2 C Bits

C. Bits
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Input

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).

Output

For each query print the answer in a separate line.

Sample test(s)
Input
3
1 2
2 4
1 10
Output
1
3
7
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.当L和R位数不齐的时候:

R110011
L  1101

那么最优解必然是比R位数少一个,每位都是1的数。(特殊的,当R本身就是111...11的时候,最优解就是R本身)

R110011
 11111
L  1101

2.如果R和L的位数相等。

R111011
11……………………
L110101

需要确定的位数仅仅是打省略号的部分。(因为如果解不是以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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值