C - Mod of XOR Editorial
by
sounansya
\(k\) を \(C\) の topbit とします。つまり、非負整数 \(k\) を \(2^k \le C < 2^{k+1}\) を満たすものとして定義します。
1. \(2^k \le n < 2^{k+1}\) のとき
\(n,C\) どちらも topbit は \(k\) なので \(n \oplus C < n\) より \(X=(n \oplus C) \bmod n = n \oplus C\) です。したがって、この範囲に解が存在する場合の解は \(n=C\oplus X\) です。
2. \(n < 2^k\) のとき
\(X=(n \oplus C) \bmod n< n < 2^k\) よりこの範囲に解がある場合は \(n=C \oplus X\) も解となります。
3. \(2^{k+1} \le n\) のとき
\(n\) を \(2^{k+1}\) で割った商とあまりをそれぞれ \(n_1,n_2\) とします(\(n=n_12^{k+1}+n_2\))。
3 - A. \(n_2 < 2^k\) のとき
\(C\) の topbit が \(n\) では \(0\) となるので \(n \oplus C > n\) が成り立ちます。これと \(n\oplus C \le n + C < 2n\) より \(\displaystyle \left\lfloor\frac{n\oplus C}{n} \right\rfloor = 1\) であるから、 \(X=(n \oplus C) \bmod n = (n \oplus C) - n = C - 2(C \ \mathrm{AND}\ n)\) となります。
したがって、この範囲に解が存在する場合は \(\displaystyle n=2^{50}+\frac{C-X}2\) も解の一つとなります。
3 - B. \(2^k \le n_2 < 2^{k+1}\) のとき
1.と同様の議論によりこの範囲に解が存在する場合の解は \(n=C\oplus X\) です。
以上の議論より、 \(\displaystyle n = C\oplus X,\ 2^{50}+\frac{C-X}2\) の \(2\) つが実際に等式を成り立たせるか調べれば良いです。
以上を適切に実装することでこの問題に正答することができます。計算量はテストケースあたり \(O(1)\) です。
for _ in range(int(input())):
c, x = map(int, input().split())
ans = -1
for n in (c ^ x, 2**50 + (c - x) // 2):
if n > 0 and (n ^ c) % n == x:
ans = n
print(ans)
posted:
last update:
