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}$

posted @ 2024-05-27 20:41  qqrj  阅读(1)  评论(0编辑  收藏  举报