Official

B - Increasing Prefix XOR Editorial by chinerist


二進法で考えます。

正整数 \(a,\ b\) の桁数が等しいとき、 \(a<c\) かつ \(b < b\oplus c\) となるのは \(c\) の桁数が \(a,\ b\) の桁数より大きいときです。このとき \(c,\ b \oplus c\) の桁数もまた等しくなります。

このことを踏まえると、条件を満たすような \(A\) について \(A_{i+1}\) の桁数は \(A_i\) の桁数より大きくなることが帰納的に示せます。 逆に \(A_{i+1}\) の桁数が \(A_i\) の桁数より常に大きい場合は明らかに条件を満たします。

よって \(M < 2^{60}\) のとき \(60 < N\) ならば答えは \(0\) です。そうでないときはあらかじめ \(1\) 以上 \(M\) 以下の整数のうち \(k\) 桁の整数の個数を集計し、

\(dp[n][k]:\) \(A_n\)\(k\) 桁の整数であり、\(A_i\) の桁数が単調増加するような正整数列 \((A_1,\ A_2,\ \dots,\ A_n)\) の個数

とおく動的計画法により \(O(N\log^2 M)\) で解けます(もしくは各 \(k\) について \(k\) 桁の整数を高々 \(1\) 個選んで合計 \(N\) 個選ぶと考えれば \(O(N \log M)\) でも解けます)。

以上よりこの問題は \(O(\log^3{M})\) (または \(O(\log^2 {M})\))で解くことができます。

posted:
last update: