CodeForces - 912B

Since Grisha behaved well last year, at New Year's Eve he was visited by Ded Moroz who brought an enormous bag of gifts with him! The bag contains n sweet candies from the good ol' bakery, each labeled from 1 to n corresponding to its tastiness. No two candies have the same tastiness.

The choice of candies has a direct effect on Grisha's happiness. One can assume that he should take the tastiest ones — but no, the holiday magic turns things upside down. It is the xor-sum of tastinesses that matters, not the ordinary sum!

A xor-sum of a sequence of integers a1, a2, ..., am is defined as the bitwise XOR of all its elements: , here  denotes the bitwise XOR operation; more about bitwise XOR can be found here.

Ded Moroz warned Grisha he has more houses to visit, so Grisha can take no more than k candies from the bag. Help Grisha determine the largest xor-sum (largest xor-sum means maximum happiness!) he can obtain.

Input

The sole string contains two integers n and k (1 ≤ k ≤ n ≤ 1018).

Output

Output one number — the largest possible xor-sum.

Example
Input
4 3
Output
7
Input
6 6
Output
7
Note

In the first sample case, one optimal answer is 12 and 4, giving the xor-sum of 7.

In the second sample case, one can, for example, take all six candies and obtain the xor-sum of 7.

————————————————————————————————————————————

题意:从1到n中选取k个数  使他们每个数的二进制异或和最大

分析:分两种情况,一种是k=1的情况,是他自己本身,也就是n,因为他要是挑选一个数的话  最大就是n

 第二种情况,当n>=2的时候,异或 就是相同为0不同为1,所以我们就可以找两个二进制数互补的,也就是相反的即可,

例如当k=8的时候,最大的时候就是1111,我们可以找1000和0111异或成1111

#include <iostream>
#include <stdio.h>
#include <stack>
#include <stdlib.h>
#include <malloc.h>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    long long n,k;
    cin>>n>>k;
   long long sum=1;
    if(k==1)
        cout<<n<<endl;
    else
    {

        while(n)
        {
            n>>=1;
            sum<<=1;
        //cout<<n<<" "<<sum<<endl;
        }

    }//异或相同为0不同为1
    cout<<sum-1<<endl;
}
在这里需要的说明的是n>>=1这个,这是位运算符号,代表向右移动1位,最高位补0,所以几个循环下来就是(n=1010)

0101->0010->0001->0000等于0结束循环,这是计算二进制有多少位的,

sum也是如此,sum的初始化为0001,向左移动,呈2的几次方倍数增加,0010(2)->0100(4)->1000(8)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值