>

暴力 dp 简单。

考虑 m 很小,所以实际上有用的位置只有不到 m 个。但是贡献系数 \(10^x\bmod p\) 不一样。

贡献系数只有 p 个,每个系数有 ? 种插的数。

先预处理 \(f(i, j)\) 表示用 \(i\) 个数和为 \(j\) 的方案数。

\(dp(i,j,k)\) 表示考虑前 \(i\) 个。


我糖丸了!!!

T3 中对于那个十进制数的限制,我一直想的是 \((pre\times 10^x+y)\bmod p\) 来算(递推做法)。

结果直接表示成 \(A=a_0\times 10^0+a_1\times 10^1+...+a_n\times 10^n\),然后按照 \(10^i\bmod p\) 来分组就做完了吧???

预处理 \(ct(i)\) 表示 \(10^x\bmod p = i\) 的个数。然后我们再预处理 \(f(i,j)\) 表示用 \(i\)\([1,9]\) 的数凑出和为 \(j\) 的方案数。这个是非常简单的。

然后 \(dp(i,j,k)\) 表示考虑前 \(i\) 个同余类,即前面的 \(10^x\bmod p\le i\),数位和为 \(j\)\(A\bmod p\) 的结果是 \(k\) 的方案数。

转移考虑当前这个同余类选择的数字和是多少 (m),转移总体复杂度是 \(O(m^2p^2)\)。考虑怎么算转移系数。

对于每个同余类,有 \(ct(i)\) 个位置,要求选出一些 \([1,9]\) 的数使得数位和等于 \(j\)。考虑枚举选了几个数 \(k\),我们就用 \(f(k,j)\)。然后其他位置选 0,再乘上一个组合系数即可。

posted @ 2024-11-08 19:08  LCat90  阅读(4)  评论(0编辑  收藏  举报