题目描述
求有多少 $ n $ 位十进制数是 $ p $ 的倍数且每位之和小于等于 $ m_i (m_i = 0, 1, 2, \ldots, m - 1, m) $,允许前导 $ 0 $,答案对 $ 998244353 $ 取模。
数据范围 $n \le 10^9\ \ \ \ p \le 50\ \ \ \ m\le1000$
算法讨论
首先有一个易得的迪屁方程
然而n太大,无法直接DP。但如果长度n为2的次幂,就可以有n/2方便得合并
发现这个式子是个卷积的形式,可以ntt加速求
这样之后,我们就的到了所有长度为2的次幂的答案
对于n的答案怎么搞呢?把n进行二进制拆分,把对应位的答案合并起来即可
然而这样写还是t了。。原来是对p的那一维卷积我是暴力搞的。。事实上这种二维的卷积也可以搞,只需要把原来的二维数组展开成一维的就好啦(神奇的是展开了卷出来也是对的!)%%%Sparrow
1 |
|