#include using namespace std; static const long long MOD = 1000000007; int main() { string S; int M; cin >> S >> M; // state: // 0 = 未選択 // 1 = 長さ1('0') // 2 = 長さ1('1'〜'9') // 3 = 長さ2以上(先頭非0) vector> dp(4, vector(M, 0)); dp[0][0] = 1; for (char c : S) { int x = c - '0'; auto ndp = dp; // 使わない遷移 for (int st = 0; st < 4; st++) { for (int m = 0; m < M; m++) { long long v = dp[st][m]; if (v == 0) continue; if (st == 0) { // 初めて選ぶ if (x == 0) ndp[1][0] = (ndp[1][0] + v) % MOD; else ndp[2][x % M] = (ndp[2][x % M] + v) % MOD; } else if (st == 1) { // "0" の後に何か付ける → 先頭0の長さ>=2 → 禁止 continue; } else if (st == 2 || st == 3) { // 先頭非0が保証されている int nm = (m * 10 + x) % M; ndp[3][nm] = (ndp[3][nm] + v) % MOD; } } } dp.swap(ndp); } long long ans = 0; // 長さ1("0" も含む) ans = (ans + dp[1][0]) % MOD; ans = (ans + dp[2][0]) % MOD; // 長さ2以上 ans = (ans + dp[3][0]) % MOD; cout << ans << '\n'; return 0; }