🔖
Atcoder ABC 121 D - XOR World 個人的メモ
\veebar, \oplus )について
XOR(0\veebar a=a a\veebar a=0
以上より,
また,交換法則が成り立つ
他にも結合法則,逆元が存在する等の特性があるらしい
アーベル群の定義?らしい
今回の話
問題文より
これを,
と変形できる
これは右辺の両関数で
で,
ここから,
という性質が分かるらしい
↓が分かり易い
さらに考察を進める
例として
以上の様な例を考えると以下のことが分かるらしい
よって,以上を実装すればおk
def solve(n):
"""F(0,n)"""
remain = n % 4
if remain == 0:
res = n
elif remain == 1:
res = 1
elif remain == 2:
res = n + 1
else:
res = 0
return res
A, B = map(int, input().split())
if A == 0:
print(solve(B))
else:
print(solve(A - 1) ^ solve(B))
もう少し凝って実装すると以下の様な感じ
以下の場合分けに則って実装している
-
が奇数n
以下の場合分けをbit演算で実装-
ならn=1\ mod\ 4(nを4で割った余りが1) f(0,n)=1
つまり を2進数で表した時の2桁目が0n -
ならn=3\ mod\ 4(nを4で割った余りが3) f(0,n)=0
つまり を2進数で表した時の2桁目が1n
-
-
が偶数n
で再帰f(0,n)=n\veebar f(0,n-1)
def func(n):
"""F(0,n)"""
if n & 1:
# 奇数
n >>= 1
return ~n & 1
else:
# 偶数
return n ^ func(n - 1)
A, B = map(int, input().split())
if A == 0:
print(func(B))
else:
print(func(A - 1) ^ func(B))
参考
Discussion