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.*;

public class Main
{
  	char[] n;
  	int d, l;
  	long mod = (long)1e9+7, tot;
  	long[][][] dp;
  
    Main(Scanner in, PrintWriter out)
    {
      n = in.next().toCharArray();
      d = in.nextInt();
      dp = new long[2][d][l = n.length];
      for (int i = 0; i < 2; i++)
        for (int j = 0; j < d; j++)
          Arrays.fill(dp[i][j], -1L);
      tot = dp(1, 0, 0);
      if (tot == 0) tot = mod;
      out.println(tot-1);
    }
  
  	long dp(int b, int s, int at)
    {
      if (s >= d) s %= d;
      if (at == l) return s == 0 ? 1L : 0L;
      if (dp[b][s][at] != -1L) return dp[b][s][at];
      
      long ans = 0L;
      int up = b == 1 ? n[at]-'1' : 9;
      if (b == 1)
        ans += dp(1, s+n[at]-'0', at+1);
      for (int i = 0; i <= up; i++)
        ans += dp(0, s+i, at+1);
      return dp[b][s][at] = ans % mod;
    }
	
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		new	Main(in, out);
		out.close();
	} 
}