#include using namespace std; #define rep(i, a, b) for (int i = (a); i < (b); i++) #define fo(i, n) rep(i, 0, n) #define all(x) std::begin(x), std::end(x) #define sz(x) int((x).size()) #define F first #define S second #define MP make_pair #define PB push_back typedef long long ll; typedef vector vi; typedef pair pii; typedef vector vvi; typedef vector vpii; typedef vector vll; typedef pair pll; typedef vector vvll; typedef vector vpll; typedef vector vd; typedef pair pdd; typedef vector vvd; typedef vector vpdd; const ll mod = 1'000'000'007; ll k, p; struct Mod { ll x; Mod(ll xx) : x(xx) {} Mod operator+(Mod b) { return Mod((x+b.x) % mod); } Mod operator-(Mod b) { return Mod((x-b.x+mod) % mod); } }; typedef vector vm; typedef vector vvm; vector pows10; signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.badbit | cin.failbit); cin >> k >> p; pows10 = vector(k+5, 1); fo(i, k+4) { pows10[i+1] = (10*pows10[i]) % p; } Mod res = Mod(0); vm s(p, Mod(0)), proc; s[0] = Mod(1); vm l(p, Mod(0)); for (int i=0; i<=9; i++) { l[i%p] = l[i%p] + Mod(1); } res = res + l[0]; rep(ki, 2, k+1) { vm& cur = (ki % 2 == 0) ? s : l; Mod zeros = Mod(0); proc = vm(p, Mod(0)); fo(pi, p) { if ((pi*10) % p == 0) zeros = zeros + cur[pi]; fo(dig, 10) { ll idx = (dig*pows10[ki-1] + pi*10 + dig) % p; proc[idx] = proc[idx] + cur[pi]; } } res = res + proc[0] - zeros; fo(i, p) { // cout << proc[i].x << " "; cur[i] = proc[i]; } // cout << endl; } cout << res.x << endl; }