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++14 (GCC 5.4.1) (judge verdict: Accepted)

/*alurquiza*/
//S:Digit Sum
#include <bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 7,SIZE = 1e4 + 1,MAXR = 100,CANTD = 10;
int DP[SIZE][CANTD][MAXR];

void sum(int &a,int b){
    a += b;
    if(a >= MOD)
        a -= MOD;
    if(a < 0)
        a += MOD;
}

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

//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);

    string K;
    int D;

    cin >> K >> D;

    int N = K.size();

    for(int i = 0;i < 10;i++)
        DP[0][i][0] = 1;

    for(int i = 1;i <= N;i++){

        ///DP[i][d][r] -> poniendo el digito d en la posicion i en cuantos numeros la suma de sus digitos es = r;
        for(int d = 0;d < 10;d++){
            for(int r = 0;r < D;r++){
                int newr = (r - (d % D) + D) % D;
                sum(DP[i][d][r],DP[i - 1][9][newr]);
            }
        }

        ///acumular la dinamica para todos los digitos con distancia r
        for(int d = 1;d < 10;d++){
            for(int r = 0;r < D;r++){
                sum(DP[i][d][r],DP[i][d - 1][r]);
            }
        }
    }

    int sol = 0,r = 0;
    for(int i = 0;i < N;i++){
        int pos = N - i;

        int digit = K[i] - '0';

        if(digit){
            sum(sol,DP[pos][digit - 1][r] % MOD);
            r = (r - (digit % D) + D) % D;
        }
    }

    ///A la solucion le quito el numero 0 y le sumo si el numero inicial cumple la condicion
    cout << (sol - 1 + !r + MOD) % MOD << '\n';

    return 0;
}