区间或和
题目
1 | 时间限制:C/C++ 1秒,其他语言2秒 |
题目描述
求$a|(a+1)|(a+2)|…|(b-1)|b$。
其中|表示按位或
输出描述
1 | 对于每组输入,输出一个数a|(a+1)|(a+2)|...|(b-1)|b。 |
示例1
输入
1 | 99 109 |
输出
1 | 111 |
备注
输入不超过10000行,$0≤a,b≤10^{18},a≤b$
解析
如果 a=b ,那么答案 =a ;
否则 a≠b ,
考虑a和b的二进制表示从高到低第一个不同的位i,
必定b的第i位=1,a的第i位=0。
那么可以断定,对于答案的二进制表示,
(1) 比第i位更高的那些位一定跟a相同。
(2) 第i位及比第i位更低的那些位一定为1。
(1)是显然的,(2)是由于把a中比第i位更低的那些位都置为1得到的数一定在区间[a,b]中
参考:
https://ac.nowcoder.com/discuss/153349?type=101&order=0&pos=8&page=1
举个例子
[2300,2323]:
2300: 100011111100
2323: 100100010011
总的结果就是2559: 100111111111
[787,2323]:
787: 001100010011
2323: 100100010011
而这个 我们注意到前面段是没有相同,那也就是可变化范围就是那整段了。
所以答案就是:4095:111111111111
参考:
http://keyblog.cn/article-67.html
1 | /* |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GreenHatHGのBlog!
评论