#include using namespace std; using ll = long long; #define all(x) begin(x), end(x) #define rep(i,a,b) for (auto i = a; i < (b); ++i) #define vi vector #define pii pair //#define W(x) cerr << #x << ": " << (x) << "\n"; #define W(x) ; const ll mod = 1000000007; ll modpow(ll b, ll e, ll p){ ll ans = 1; for(; e; b=b*b%p, e/=2) if(e&1)ans=ans*b%p; return ans; } int k, p; vector pocty; ll res = 0; void dump_pocty(vector &l) {return; cerr << "#pocty:"; for(ll a: l){ cerr << " " << a; } cerr << "\n"; } int digits = 0; ll round() { dump_pocty(pocty); vector new_pocty; new_pocty.reserve(p); rep(i,0,p) new_pocty.push_back(0); rep(i,0,p) new_pocty[(10*i)%p] = (new_pocty[(10*i)%p] + pocty[i]) % mod; rep(i,0,p) pocty[i] = new_pocty[i]; rep(i,0,p) new_pocty[i] = 0; dump_pocty(pocty); digits += 2; ll tmp = (modpow(10, digits-1, p) + 1) % p; ll res = 0; rep(x,0,10){ ll pmd = (tmp * x) % p; rep(i,0,p) { int new_pos = (i + pmd) % p; new_pocty[new_pos] = (new_pocty[new_pos] + pocty[i]) % mod; } dump_pocty(new_pocty); if(x == 0){ res -= new_pocty[0]; } W(res); } //cerr << "tady\n"; W(res); dump_pocty(new_pocty); res += new_pocty[0]; while(res < 0) res += mod; res %= mod; rep(i,0,p) pocty[i] = new_pocty[i]; dump_pocty(pocty); W(digits); W(res); return res; } int main () { cin.tie(0)->sync_with_stdio(0); cin >> k >> p; pocty.reserve(p+10); rep(i,0,p+10) pocty.push_back(0); ll res = 0; pocty[0] = 1; while(digits + 2 <= k){ res = (res + round()) % mod; } rep(i,0,p+10) pocty[i] = 0; digits = 1; rep(i,0,10){ int pos = i % p; pocty[pos] = (pocty[pos]+1) % mod; if(i%p == 0){ res = (res + 1) % mod; } } while(digits + 2 <= k){ res = (res + round()) % mod; } cout << res << "\n"; return 0; }