题目链接:题目传送门
题目大意:给你n个数,值为1-n,选出其中的m个数进行异或(^),求其最大值。
n和m的范围为1e^18
思路:贪心的做法
当m=1时,则是最大值n
当m>1时,则将n的二进制数从右到最高位全部变成1,贪心的想,是不是脑洞大开的感觉。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
long long n,m;
while(~scanf("%I64d%I64d",&n,&m))
{
if(m==1)
{
printf("%I64d\n",n);
continue;
}
long long ans=0;
long long bas=1;
while(n!=0)
{
ans+=bas;
n/=2;
bas*=2;
}
printf("%I64d\n",ans);
}
return 0;
}