幽默数位 DP。
设 $dp_{i,j,0/1}$ 表示前 $i$ 位,前缀和为 $j$,是否顶上界,余数为 $0$ 的方案数。
转移和板子有什么区别吗?对不起,这题本来就是板子。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 15, M = 115, mod = 1e9 + 7;
int n, d;
char ch[N];
int dp[N][M][2];
int DP(int u, int rest, bool up) {
if (u == n + 1) return rest == 0;
if (~dp[u][rest][up]) return dp[u][rest][up];
int lim = up ? (ch[u] - '0') : 9;
dp[u][rest][up] = 0;
for (int i = 0; i <= lim; i++)
(dp[u][rest][up] += DP(u + 1, (rest + i) % d, up & (i == lim))) %= mod;
return dp[u][rest][up];
}
int main() {
memset(dp, -1, sizeof dp);
scanf("%s %d", ch + 1, &d);
n = strlen(ch + 1);
printf("%d\n", (DP(1, 0, 1) - 1 + mod) % mod); //0
return 0;
}