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\) 種類があります。
上から \(i-1\) 桁目までは \(N\) と一致して \(i\) 桁目が \(N\) より小さいもの( \(i+1\) 桁目以降は任意)
\(N\) そのもの
\(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: