#include #include using namespace std; using ll = long long; #define int ll constexpr int MOD = 1'000'000'007; constexpr int MAXN = 2010; int dp[MAXN][MAXN][2]; int k, p; ll solve(int mx_d, bool odd) { for (int i = 0; i <= mx_d; i++) { for (int j = 0; j < p; j++) { dp[i][j][0] = dp[i][j][1] = 0; } } ll dec = 10; if (odd) { for (int i = 0; i <= 9; i++) { dp[0][i % p][i != 0]++; } dec *= 10; } else { dp[0][0][0] = 1; } for (int i = 1; i <= mx_d; i++) { for (int j = 0; j < p; j++) { for (int d = 0; d <= 9; d++) { ll cur = j * 10 + dec * d + d; cur %= p; if (d == 0) { dp[i][cur][0] = (dp[i-1][j][0] + dp[i-1][j][1] + dp[i][cur][0]) % MOD; } else { dp[i][cur][1] = (dp[i-1][j][0] + dp[i-1][j][1] + dp[i][cur][1]) % MOD; } } } dec = (dec * 100) % p; } ll ans = 0; for (int i = 0; i <= mx_d; i++) { ans = (ans + dp[i][0][1]) % MOD; } // for (int i = 0; i <= mx_d; i++) { // for (int j = 0; j < p; j++) { // cout << "(" << dp[i][j][0] << ',' << dp[i][j][1] << ")"; // } // cout << endl; // } // cout << endl << endl; return ans; } bool is_pal(string const& s) { for (int i = 0; i < s.size() / 2; i++) { if (s[i] != s[s.size() - i - 1]) return false; } return true; } ll brute(int K, int P) { ll ans = 0; // cerr << "------ k=" << K << " p= " << P << endl; for (int i = 0; i < pow(10, K); i++) { if (i % P != 0) continue; string str = to_string(i); if (!is_pal(str)) continue; ans++; // cerr << "ok: " << i << endl; } return ans; } ll smart(int K, int P) { k = K, p = P; ll ans = solve(k / 2, false) + solve((k - 1) / 2, true) + 1; return ans % MOD; } signed main() { // for (int P = 2; P <= 1000; P++) { // for (int K = 9; K <= 11; K++) { // cout << "k=" << K << " p=" << P << endl; // auto br = brute(K, P); // auto smr = smart(K, P); // if (br != smr) { // cout << "WA on this:" << endl; // cout << "k=" << k << " p=" << p << endl; // cout << "brute=" << br << " smart=" << smr << endl; // return 0; // } // } // } cin >> k >> p; cout << smart(k, p) << endl; }