coincidence - abc 138 f
#桁dp #xor
mod → 大小関係を見る
を適用.
x > y
余りは y で, xor は y ^ x.
y % x = y ^ x (与えられた式)
y = x ^ y
0 ^ y = x ^ y
x = 0
制約より不可 (そもそも x ≤ y が制約).
y = x
y % x = y ^ x (与えられた式)
0 = 0
常に ok.
x < y
x, yの桁数が違う場合
y % x = y ^ x になりえない.
まず, y ^ x の最上位桁は 1.
y % x < x より, y % x の最上位桁は 0.
桁数が同じ場合
x < y < 2x より y / x = 1.
y = y (+ x - x) = x + (y - x)
より,
y % x = y - x (ポイント !!)
y % x = y ^ x
y - x = y + x - 2 * (y & x)
x = y & x
y = 1 1 0 1 0 とすると,
x = ? ? 0 ? 0
0
1
だけ禁止.
ただし, 桁数は同じ.
(先頭は 1 1)
あと, L ≤ x ≤ y ≤ R
L ≤ x, y ≤ Rを判定すればいい
dp[i][j][k][l]
i : 桁 0 ~ 60
j : 0, 1 → L ≤ xをすでに満たしているか or 今のところ一致.
k : 0, 1 → y ≤ R を...
l : 先頭 bit (1 1) がすでに現れたか.
j に関して具体例.
L = 1011 とする.
x = 0... はだめ (x < L).
x = 10... は今のところ一致 (L = x).
x = 11... はすでに L ≤ x を満たしてるからあとはなんでもok.
ソースコード
Submission #14061717 - AtCoder Beginner Contest 138
補足.
x < y の場合, x = 0 しかない他の説明.
y ^ x = (y + x) - 2(y & x) より,
y % x = y ^ x (与えられた式)
y = (y + x) - 2(y & x)
x = 2(y & x) (x は偶数)
y & x = x / 2
y & x が x を右に 1 つシフトしたものに等しい.
x は 0 でない偶数なので, 最下位桁でない桁に 1 がある.
一番右の 1 の右隣は 0 なので, x & y x / 2.