【AGC015-D】A or ... or B problem を解いた

【自分の解法】

自明に$\ A\leq x\leq B\ $を満たす任意の$\ x \in \mathbb{N}\ $は構築できる。

ここで,伝家の宝刀†$\rm{dp}$†を用いて実験すると,どうやら$ A\leq x\leq l,\ r\leq x\leq f(A, B)\ $を満たす任意の$\ x \in \mathbb{N}\ $と構築できる$\ x \in \mathbb{N}\ $の集合が一致するような$l,\ r\ (l \leq r)$が存在するらしい。(ただし,$\ f(A,\ B)\ $は構築できる最大の整数)

このとき,求める答えは$$f(A,\ B) - A + 1 - max(r - l - 1, 0)$$である。

よって,この問題に解答する為には,$f(A,\ B),\ l,\ r$を求めればよい。

【$f(A, \ B)$を求める】

自明に$f(A, \ B) = A or ... or B$であるので,桁ごとに考える。

2進数で見て,$A,\ B$が上からみて下から$k$桁目まで一致しているとき,$k - 1$桁以下の桁は全て$1$にすることが可能なので,求める答えは,

$$ 2^k - 1 + \displaystyle \sum_{p = k}^{10^{1000}} (2^p\  \rm{and} \  B)$$

 

【$l,\ r$を求める】

まず,$A\leq \displaystyle \sum_{p = k}^{10^{1000}} (2^p\ \rm{and} \ B) \leq B$を満たすもののうち,最大のものを$v$とする。また,$B \leq l \leq r$であるので,

$$l = f(v, B),\ r = v\  \rm{or} \  A$$である。

これより,$B$の桁数を$N$として,時間計算量$\rm{O}(N)$でこの問題を解くことができた。