有 m 种货币,第 i 种面值为 2i−1,求凑出 n 元钱有多少种方案数,对 998244353 取模。
Ex:求 n 有多少种 m 位 k 进制表示(每一位的数字无上限)。
1≤m≤30,0≤n≤1018,2≤k≤16。
考虑把面值为 2i 的货币拆成面值 2i、2i+1、2i+2……的货币各一个,即把 2i 的选择个数 ai“摊平”。这样就可以转化为 01 背包。
那么数位 dp,设 dpi,j 表示考虑完 20∼2i,向后进了 j 的方案数。
转移考虑枚举有 k 种面值当前位都为 1,枚举上一位的进位 l,则:
dpi,⌊2k+l⌋=[k+l≡n2i (mod 2)](kmin(m,i+1))dpi−1,l
Ex 做法类似,不过拆出来的每种货币可以选 k−1 个。