题意:
思路:根据数据范围可知,长度最多有18位,每位有9种可能。所以用dfs时间复杂度是9^18次方。这样肯定是会tle的,所以这里思考dp如何解决,那么dp就是如何描述一类状态,然后将答案归到某一类中,定义f[i][j]为前i位,%k为j的方案数量。那么初始状态就是f[0][0] = 1。对于1XX,n = 3,那么f[1][1] = 1是显然的,f[1][k]都为0。那么如何从f[1][1]推到f[2][k]的状态。我们知道对于abc来说,abc%n = (ab * 10 + c) % n = (ab * 10 % n + c % n) % n ,也就是当前的余数 = 前i - 1位的余数 + c的余数再对n取余。那么f[1][1]就可以推到至f[2][(1 + k % n) % n](0 < k < 10),那么这也是我们的状态转移方程,那么问题就顺利的解决了。
状态转移方程为:
当第i位为X时:f[i][newp] += f[i - 1][j] (newp = (j + k % n) % n)
当第i位不为X时:f[i][newp] += f[i - 1][j] (newp = (j + (str[i - 1] - '0') % n) % n)
具体细节见代码:
#include <iostream