Problem:
Score : 100 points

Problem Statement

Find the number of integers between 1 and K (inclusive) satisfying the following condition, modulo 10^9 + 7:

The sum of the digits in base ten is a multiple of D.

Constraints

All values in input are integers.

1 \leq K < 10^{10000}

1 \leq D \leq 100

Input

Input is given from Standard Input in the following format:

K
D

Output

Print the number of integers satisfying the condition, modulo 10^9 + 7.

Sample Input 1

30
4

Sample Output 1

6

Those six integers are: 4, 8, 13, 17, 22 and 26.

Sample Input 2

1000000009
1

Sample Output 2

2

Be sure to print the number modulo 10^9 + 7.

Sample Input 3

98765432109876543210
58

Sample Output 3

635270834

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxn = 10005, maxd = 110, mod = 1e9 + 7;
string K;
int D, n;
vector<int> digits;
ll dp[maxn][maxd][2];

ll rec(int pos, int sum, int flag) {
    if (pos == n) {
        if (sum % D == 0) {
            return 1;
        }
        return 0;
    }
    if (dp[pos][sum][flag] != -1) {
        return dp[pos][sum][flag];
    }
    int limit = (flag == 1)? digits[pos] : 9;
    ll tot = 0;
    for (int i = 0; i <= limit; i++) {
        if (i == digits[pos]) {
            tot = (tot + rec(pos + 1, (sum + i) % D, flag)) % mod;
        } else {
            tot = (tot + rec(pos + 1, (sum + i) % D, 0)) % mod;
        }
    }
    return dp[pos][sum][flag] = tot;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> K >> D;
    for (char it : K) {
        digits.push_back(it - '0');
    }
    n = digits.size();
    memset(dp, -1, sizeof(dp));
    ll answer = (rec(0, 0, 1) - 1 + mod) % mod;
    cout << answer;

    return 0;
}