CF 456 div.2 B. New Year's Eve

题意:从1~n中选最多k个数,使异或值最大

啊啊啊   no more than k  每次都自动忽略 奇了怪了

刚开始以为必须选k个数, 想了半天 

wa  既然最多能选k个数 那选俩异或值最大的(k==1 就只能选n了

2^p xor z^p-1 == 2^(p+1)-1 能得到最大值

找<=n的最大2^p就行

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> p;
typedef long double ld;
#define mem(x) memset(x, 0, sizeof(x))
#define me(x) memset(x, -1, sizeof(x))
#define fo(i,n) for(i=0; i<n; i++)
#define sc(x) scanf("%lld", &x)
#define pr(x) printf("%lld\n", x)
#define pri(x) printf("%lld ", x)
#define lowbit(x) x&-x
const ll MOD = 1e18 +7;
const ll N = 6e6 +5;

int main()
{
ll i, j, k, l=1;
ll n, m, t;
//取2^p<=n, 则2^p xor 2^P-1 == 2^(p+1)-1 为最大值
cin>>n>>k;
if(k==1)
return cout<<n<<endl,0;
while(l<=n) l*=2;
cout<<l-1<<endl;
return 0;
}

posted @ 2019-04-30 18:43  op-z  阅读(87)  评论(0编辑  收藏  举报