P2481 [SDOI2010] 代码拍卖会
P2481 [SDOI2010] 代码拍卖会
考虑位数为 \(n^{18}\), 很不可做, 但是我们发现 \(p\) 很小, 并且条件要求 \(p\) 整除这个数, 所以我们可以只考虑余数, 那么dp状态肯定有一维 \(s\) 是 \(x mod p = s\), 再考虑。
要求这个数各个位上的数单调不降, 那么依靠经(ti)验(jie), 就会发现, 必定是由 \(\leq 9\) 个 \(1\) 的后缀拼成的数, 考虑 \(1\) 的后缀还是有 \(n^{18}\) 个数, 但是 \(p\) 很小, 并且这些数是有递推式子的, 所以有循环节, 所以我们可以很快计算出 \(g_i\) 表示 \(mod p = i\) 的 \(1\) 的后缀的个数。 那么就有背包dp。
\(f_{i, j, s}\)表示考虑余数 \(\leq i\) 的 \(1\) 的后缀, 现在已经选了 \(j\) 个 \(1\) 的后缀, 和同余 \(s\) 的数的个数。
$ f_{i, j + k, (s + i * k) mod p} = f_{i, j, k} * C_{n + k - 1}^{k}$