#include using namespace std; using ll = long long; const int mod = 1e9 + 7; int add(int x, int y) { return (x + y >= mod ? x + y - mod : x + y); } int mul(int x, int y) { return x * 1ll * y % mod; } bool pal(int n) { string s; while (n > 0) { s += char(n % 10 + '0'); n /= 10; } string t = s; reverse(t.begin(), t.end()); return s == t; } int brute(int k, int p) { int ans = 0; for (int i = 0; i < (int)pow(10, k); i++) { if (pal(i) == false || i % p != 0) continue; ans += 1; } return ans; } int fast(int k, int p) { vector p10(k + 1); p10[0] = 1; for (int i = 1; i <= k; i++) { p10[i] = p10[i-1] * 10 % p; } vector> fdp; fdp.push_back(vector (p, 0)); fdp.push_back(vector (p, 0)); fdp.push_back(vector (p, 0)); fdp[0][0] = 1; for (int i = 0; i <= 9; i++) { fdp[1][i % p] += 1; } // for (int i = 11; i <= 99; i+=11) { // fdp[2][i % p] += 1; // } int ans = fdp[1][0]; for (int i = 2; i <= k; i++) { fdp.push_back(vector (p, 0)); for (int d = 1; d <= 9; d++) { int cont = (d * p10[i - 1] + d) % p; for (int r = 0; r < p; r++) { int remi = (r * 10 + cont) % p; fdp[i][remi] = add(fdp[i][remi], fdp[i - 2][r]); } } ans = add(ans, fdp[i][0]); for (int r = 0; r < p; r++) { fdp[i][r * 10 % p] = add(fdp[i][r * 10 % p], fdp[i - 2][r]); } // cout << i << " " << fdp[i][0] << "\n"; } return ans; } int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int k, p; cin >> k >> p; // cout << brute(k, p) << "\n"; cout << fast(k, p) << "\n"; return 0; for (int j = 1; j <= 10; j++) { for (int i = 1; i <= j; i++) { int bs = brute(i, j); int fs = fast(i, j); if (bs == fs) continue; cout << i << " " << j << "\n" << bs << " " << fs << endl; } } return 0; }