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: Runtime Error)

import java.util.*;
 
 
import java.io.*;
 
 
 
public class Main 
{   
	
	static int dp[][][];
	static long mod=1000000007;
	public static void main(String[] args) throws IOException 
	{ 
		 
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
		
			StringTokenizer s=new StringTokenizer(br.readLine());
			String st=s.nextToken();
			s=new StringTokenizer(br.readLine());
			int d=Integer.parseInt(s.nextToken());		 
			dp=new int[20][105][2];
			
			
			for (int i = 0; i < 20; i++) {
	            for (int j = 0; j < 105; j++) {
	                for (int k = 0; k < 2; k++) {
	                    dp[i][j][k] = -1;
	                }
	            }
	        }
			
			long ans=solveD(st,0,0,d,true);			
			pw.println((ans-1)%mod);
			pw.close();
		
		
	}
	private static int solveD(String s, int pos,int cnt, int d, boolean tight) {
		// TODO Auto-generated method stub
		if(pos==s.length())
			return (cnt==0)?1:0;
		
		if(dp[pos][cnt][(tight)?1:0]!=-1)
			return dp[pos][cnt][(tight)?1:0];
		
		int ans=0;
		
		int end=(tight)?(s.charAt(pos)-'0'):9;
		
		for(int i = 0; i<=end ;i++){
			
				ans = (int) ((ans+ solveD(s,pos+1,(cnt+i)%d,d, tight&(i==end)))%mod);
		}
		return dp[pos][cnt][(tight)?1:0] = ans;
	}
	
	
}