Make Good - goodbye 2019 c
#xor
editorial の補足
解法1
数列に同じ 2 数を足しても xor は変わらない
sum は 2 * その数増える
2 * xor = sum にしたい
数列に足す 2 数は, (2 * xor - sum) / 2
ただし, 2 * xor - sum が偶数かつ 2 * xor ≥ sum
2 * xor は偶数より, sum が偶数
残り 1 数足せる
それで sum が偶数かつ 2 * xor ≥ sum の条件を満たすようにする
sum を偶数にするから, sum が奇数なら 1 を足す
sum はどれくらいになるか
+ (sum % 2) を sum に足すと sum <
また, + (sum % 2) を数列に足すと xor ≥ (そんな大きな bit が立ってないので)
2 * xor ≥ > sum
解法2
単純なケースを考える
2 数を足す場合を考える
S + a + b = 2 * (X ^ a ^ b)
仮に右辺の X を打ち消そうとしても左辺に X が出てくる
右辺に 2 * X があるので左辺にも出る
左辺に S があるので右辺にも出る
右辺が 2 * という形なので, 左辺に S がもう 1 つあるとする
a + b = S + 2X
X ^ a ^ b = S + X
a = X, b = S + X
editorial
コード
解法 1
3 数足す固定
https://codeforces.com/contest/1270/submission/67975602