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 Pascal (FPC 2.6.2) (judge verdict: Accepted)

uses math;
const fi='digitnum.inp';
      fo='digitnum.out';
      maxn=10000;
      modu=trunc(1e9)+7;
var f:array[1..maxn,0..99,0..2] of uint64;
    s:ansistring;
    d,len:int16;
procedure nhap;
begin
   readln(s);
   read(d);
end;
procedure init;
var i,j,x:int32;
begin
   x:=ord(s[1])-48;
   for i:=1 to 9 do
    begin
       if i<x then j:=0
       else if i>x then j:=2
       else j:=1;
       inc(f[1,i mod d,j]);
    end;
end;
function calc(n:ansistring):uint64;
var i,j,r,st,x,newst,newr:int32;
    ans:uint64;
begin
   len:=length(n);
   for i:=1 to len-1 do
    for r:=0 to d-1 do
     for st:=0 to 2 do
      begin
         x:=ord(n[i+1])-48;
         for j:=0 to 9 do
          begin
             newst:=st;
             if newst=1 then
              begin
                 if j<x then newst:=0
                 else if j>x then newst:=2
                 else newst:=1;
              end;
             newr:=(r+j) mod d;
             f[i+1,newr,newst]:=(f[i+1,newr,newst]+f[i,r,st]) mod modu;
          end;
      end;
   ans:=0;
   for i:=1 to len-1 do
    for j:=0 to 2 do inc(ans,f[i,0,j]);
   exit((ans+f[len,0,0]+f[len,0,1]) mod modu);
end;

procedure xuli;
begin
   init;
   write(calc(s));
end;
begin
//   assign(input,fi); reset(input);
//   assign(output,fo); rewrite(output);
   nhap;
   xuli;
//   close(input); close(output);
end.