Codeforces 276D Little Girl and Maximum XOR【贪心】

来源:互联网 发布:nba马刺vs小牛数据 编辑:程序博客网 时间:2024/05/28 16:11

D. Little Girl and Maximum XOR
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

A little girl loves problems on bitwise operations very much. Here's one of them.

You are given two integers l and r. Let's consider the values of  for all pairs of integers a and b (l ≤ a ≤ b ≤ r). Your task is to find the maximum value among all considered ones.

Expression  means applying bitwise excluding or operation to integers x and y. The given operation exists in all modern programming languages, for example, in languages C++ and Java it is represented as "^", in Pascal — as «xor».

Input

The single line contains space-separated integers l and r (1 ≤ l ≤ r ≤ 1018).

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cincout streams or the %I64dspecifier.

Output

In a single line print a single integer — the maximum value of  for all pairs of integers ab (l ≤ a ≤ b ≤ r).

Examples
input
1 2
output
3
input
8 16
output
31
input
1 1
output
0

题目大意:


在区间【L,R】内找到两个数,使得他们的异或值最大。


思路:


①我们从高位开始贪心即可,如果两个数L,R的2进制位数长度不同,设定R的2进制长度为x的话,那么答案一定是(1<<x)-1;因为我们可以让R除了最高位之外,都变成0,让L所有位子都变成1.并且长度为x-1.


②否则,如果两个数长度相等且部分前边高位数值一样的话,我们忽略不计,只找最高位不同的位子即可。


Ac代码:

#include<stdio.h>#include<string.h>using namespace std;#define ll __int64int main(){    ll l,r;    while(~scanf("%I64d%I64d",&l,&r))    {        for(ll i=60;i>=-1;i--)        {            if(i==-1||((l>>i)^(r>>i)))            {                printf("%I64d\n",((1ll<<(i+1))-1));                break;            }        }    }}







阅读全文
0 0
原创粉丝点击