はまやんはまやんはまやん

hamayanhamayan's blog

New Year's Eve [Codeforces Round #456 B]

http://codeforces.com/contest/912/problem/B

1,2,3,...,Nのように[1,N]の数が1つずつ用意されている。
ここからK個以下の数を取ってきてxorを取る。
最大値は?

解法

http://codeforces.com/contest/912/submission/33927735

K=1の場合はxorを取る余地がなく、ただ最大値を答えるしかない。
Nを答えて終わろう。

2≦Kの場合は2つの数を取ることで必ず最大値を作ることができる。
例えばN=14を考えてみよう

14 = 1110であるが
1000 : 最上位ビットだけ立っている数
0111 : その1つ前の数
↓
1111 : 最大値!

つまり、ビットが立っている最上位ビットまで全て1であるような数を2つの数から作ることができる。
よって、これを計算して答える。

typedef long long ll;
ll N, K;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> K;

    if (K == 1) {
        printf("%lld\n", N);
        return;
    }

    ll ans = 1;
    while (ans <= N) ans *= 2;
    ans--;
    cout << ans << endl;
}