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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.*;
import java.io.*;
class Main {
    static long MOD = (long)(1e9+7);
    static long[][][] dp;
    static long recurse(String s, int mod, int idx, boolean isTight, int currRem) {
        if(idx==s.length()) {
            if(currRem==0)
                return 1;
            return 0;
        }
        int secIdx = isTight?1:0;
        if(dp[idx][secIdx][currRem]!=-1)
            return dp[idx][secIdx][currRem];
        int limit = 9;
        int currDig = s.charAt(idx)-'0';
        if(isTight)
            limit = currDig;
        long ans = 0;
        for(int i = 0; i<=limit; i++) {
            boolean newTight = isTight;
            if(i<limit)
                newTight = false;
            int newRem = (currRem+i)%mod;
            ans = (ans + recurse(s, mod, idx+1, newTight, newRem))%MOD;
        }
        return dp[idx][secIdx][currRem] = ans;
    }
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int rem = sc.nextInt();
        dp = new long[s.length()][2][rem];
        for(long[][] i: dp)
            for(long[] j: i)
                Arrays.fill(j, -1);
        long ans = (recurse(s, rem, 0, true, 0)+MOD-1)%MOD;
        System.out.println(ans);
    }
}