F - Digits Paradise in Hexadecimal Editorial by Kiri8128


桁 DP を使わなくても求められます。 \(d\) を基数(本問だと \(16\) )とします。また \(N\)\(16\) 進法での桁数を \(M\) とします。また \(N\) の上から \(i\) 桁目を \(N[i]\) とします。

\(calc(a,\ b)\) を「\(a\) 種類使っている状態に任意の \(b\) 文字を足して全体で \(K\) 種類にする方法の数」と定義します。 これは、包除原理により適切な前計算のもと \(O(d)\) で計算できます。

ところで \(N\) 以下の正整数は次の \(3\) 種類があります。

  1. 上から \(i-1\) 桁目までは \(N\) と一致して \(i\) 桁目が \(N\) より小さいもの( \(i+1\) 桁目以降は任意)

  2. \(N\) そのもの

  3. \(N\) より桁数が少ないもの

まず 1. については、 \(N\) の上から \(i\) 桁目までの数字の集合を \(S\) とすると \(i\) 桁目の数字 \(x\)\(0\le x<N[i]\) )について、 \(x\in S\) のとき \(calc(len(S), M-i)\) 、そうでないとき \(calc(len(S)+1,\ M-i)\) です。上の桁から \(S\) を更新しながら計算できます。 2. については \(0\) または \(1\) です。 3. については \(i\) 桁(\(i=1,2,...\))のものは \(calc(1,\ i-1) \times 15\) 通りあります。

これらをすべて合計すれば答えになります。計算量は \(O(Md)=O(log(N)d)\) です。

posted:
last update: