import std.stdio, std.conv, std.string, std.bigint;
import std.math, std.random, std.datetime;
import std.array, std.range, std.algorithm, std.container, std.format;
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }

/*

桁の数字の和 digit sum

----------------------------------------

「1 以上 j99999... (9がi個) 以下の整数のうち、桁の数字の和を D でわったあまりが r であるものの個数」を
xs[i][j][r] とする。

xs[0][j][r] = (j == r? 1: 0)

xs[i][0] = xs[i - 1][9] である

xs[i][j] は、xs[i][j - 1] に、「xs[i - 1][9] を j だけずらしたもの」を項ごとにたしたもの
具体的には
xs[i][j][r] = xs[i][j - 1][r] + xs[i - 1][9][(r + d - j) % d]


K = 47185, D = 50 の場合

・39999 以下 …… xs[4][3][0]
・46999 以下 …… xs[3][6][46]
・47099 以下 …… xs[2][0][39]
・47179 以下 …… xs[1][7][38]
・47184 以下 …… xs[0][4][30]
・47185

に分けて求める

----------------------------------------

*/

const mod = 1_000_000_007;

void main(){
	string kstr = readln.chomp;
	long d = read.to!long;
	
	long[][][] xs;
	xs ~= [[]];
	foreach(j; 0 .. 10){
		xs[0] ~= [[]];
		foreach(r; 0 .. d){
			if(j == 0){
				if(r == 0) xs[0][j] ~= 1;
				else xs[0][j] ~= 0;
			}
			else if(j % d == r) xs[0][j] ~= xs[0][j - 1][r] + 1;
			else xs[0][j] ~= xs[0][j - 1][r];
		}
	}
	
	foreach(i; 1 .. kstr.length + 1){
		xs ~= [[]];
		foreach(j; 0 .. 10){
			xs[i] ~= [[]];
			foreach(r; 0 .. d){
				debug writeln("i:", i, " j:", j, " r:", r, " xs:", xs);
				if(j == 0) xs[i][j] ~= xs[i - 1][9][r];
				else xs[i][j] ~= (xs[i][j - 1][r] + xs[i - 1][9][(r + d * j - j) % d]) % mod;
			}
		}
	}
	
	long ans;
	long offset = 0;
	foreach(iv, c; kstr){
		long i = kstr.length - 1 - iv;
		debug writeln("iv:", iv, " c:", c, " i:", i, " offset:", offset);
		if(c >= '1') ans += xs[i][c - '1'][offset], ans %= mod;
		offset += d - (c - '0'), offset %= d;
		debug writeln("ans:", ans);
	}
	if(offset == 0) ans += 1, ans %= mod;
	
	ans += mod - 1, ans %= mod; //「0」が含まれてしまうので
	
	ans.writeln;
}
