给你一个n和d,求1-n中有多少个数位和是d的倍数
数位dp
#include <bits/stdc++.h> #include <iostream> #include <string.h> #include <math.h> using namespace std; typedef long long ll; const ll mod = 1e9 + 7; const int maxn = 10005; int digit[maxn], tot, d; ll dp[maxn][105]; ll dfs(int len, int pre, int top) { if (!len) { if (pre == 0) return 1; return 0; } if (!top && dp[len][pre] != -1) return dp[len][pre]; int up = (top ? digit[len] : 9); ll res = 0; for (int i = 0; i <= up; i++) { res += dfs(len - 1, (pre + i) % d, top && (i == up)); res %= mod; } if (!top) dp[len][pre] = res; return res; } ll solve(int n) { memset(dp, -1, sizeof(dp)); tot = n; return dfs(tot, 0, 1); } char str[maxn]; int main() { //freopen("in.in", "r", stdin); // freopen("o2.out", "w", stdout); scanf("%s%d", str + 1, &d); int n = strlen(str + 1); for (int i = n, j = 1; i >= 1; i--, j++) { digit[j] = str[i] - '0'; } cout << (solve(n) - 1 + mod) % mod<< endl; return 0; }