ACM-Fjnu18级第一次友谊赛F题题解
题面:
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).OUPUT
Output one number — the largest possible xor-sum.
Examples
Note
> In the first sample case, one optimal answer is 1, 2 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.
此题思维量并不大,难点应该是对于XOR运算的理解
所以我觉得是翻译题而已
XOR(异或)运算是二进制运算
简单地
1^1=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.
那么接下来翻译一下题目:
给出n种物品(每种一个),只能取走不超过k个的物品。
题目要求就是:从1~n中选出k个物品(价值),使得它们的异或值最大
易知如:4=0100>3=0011且7=2^3-1
60=0111100>3=0000011且63=2^6-1
4^3=111,64 ^63=1111111
易知只要k>=2时总能从1~n中取得异或值最大为与n二进制同位数的所有位皆为1的数
那就很简单了
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <bits/stdc++.h>
#define N 100050
#define double pai = 4.0*atan(1.0)
#define mes(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long int ll;
int main()
{
ll n , k;
while(cin>>n>>k)
{
ll p=n;
if(k==1) cout<<n<<endl;//根据note知道直接输出n就好了
else/*只要算位数就行了,反正到最后都是11……*/{
ll result=1;
n<<=1;
while(n>>=1) result*=2;
cout<<result-1<<endl;//2^M-1 总能XOR
}
}
return 0;//学艺不精告辞
}