#include #pragma gcc optimize("Ofast") using namespace std; using ll = long long; constexpr ll MOD = 1000000007; vector pows_10; ll DP[2001][2001]; void mod_add(ll& a, ll b) { a = (a + b) %MOD; } int main() { ll k, p; cin >> k >> p; pows_10 = vector(k+1); pows_10[0] = 1; for (int i = 1;i <= k; i++) { pows_10[i] = pows_10[i-1] * 10 % p; } ll ans = 0; for (int i = 0; i < 10; i++) if (i%p == 0) { ans++; } for (int digits = 2; digits <= k; digits++) { DP[0][0] = 1; for (int set = 0; set < digits/2; set++) { ll modifier = (pows_10[set] + pows_10[digits - set - 1])% p; for (int zv = 0; zv < p; zv++) if (DP[set][zv] != 0) { ll val = DP[set][zv]; for (int digit = (set == 0); digit < 10; digit++) { mod_add(DP[set+1][(zv + modifier*digit)%p], val); } } } if (digits % 2 == 1) { int set = (digits)/2; ll modifier = (pows_10[set])% p; for (int zv = 0; zv < p; zv++) if (DP[set][zv] != 0) { ll val = DP[set][zv]; for (int digit = (set == 0); digit < 10; digit++) { mod_add(DP[set+1][(zv + modifier*digit)%p], val); } } } //for (int i = 0; i <= digits; i++) { // for (int j = 0; j < p; j++) { // cerr << DP[i][j] << ' '; // }cerr << endl; //} //cerr << endl; mod_add(ans, DP[(digits+1)/2][0]); for (int set = 0; set <= digits/2+1; set++) { for (int zv = 0; zv < p; zv++) DP[set][zv] = 0; } } cout << ans << '\n'; }