>

LCat90發表於2024-11-08

暴力 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,再乘上一個組合係數即可。