#include #include using namespace std; using mint = atcoder::modint998244353; template struct Matrix { int h = 0, w = 0; vector> a; Matrix(int h, int w, T value = T{}) : h(h), w(w), a(h, vector(w, value)) {} Matrix(initializer_list> rows) : h((int)rows.size()), w(rows.size() == 0 ? 0 : (int)rows.begin()->size()) { a.reserve(h); for (const auto& row : rows) { assert((int)row.size() == w); a.emplace_back(row); } } static Matrix identity(int n) { Matrix res(n, n); for (int i = 0; i < n; i++) res[i][i] = T{1}; return res; } vector& operator[](int i) { return a[i]; } const vector& operator[](int i) const { return a[i]; } Matrix operator*(const Matrix& other) const { assert(w == other.h); Matrix res(h, other.w); for (int i = 0; i < h; i++) { for (int k = 0; k < w; k++) { for (int j = 0; j < other.w; j++) { res[i][j] += a[i][k] * other[k][j]; } } } return res; } vector operator*(const vector& v) const { assert(w == (int)v.size()); vector res(h); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { res[i] += a[i][j] * v[j]; } } return res; } Matrix pow(long long exp) const { assert(h == w); assert(exp >= 0); Matrix base = *this; Matrix res = identity(h); while (exp > 0) { if (exp & 1LL) res = res * base; base = base * base; exp >>= 1LL; } return res; } }; int main() { string N; int K; cin >> N >> K; Matrix M = Matrix::identity(20); array cnt_row{}, sum_row{}; for (int i = 0; i < 20; i++) { for (int j = 0; j < 10; j++) { cnt_row[i] += M[j][i]; sum_row[i] += M[10 + j][i]; } } for (char ch : N) { int x = ch - '0'; auto pre_c_row = M[x]; auto pre_s_row = M[10 + x]; vector new_c_row(20), new_s_row(20); for (int i = 0; i < 20; i++) { new_c_row[i] = cnt_row[i]; new_s_row[i] = x * cnt_row[i] + 10 * sum_row[i]; } M[x] = new_c_row; M[10 + x] = new_s_row; for (int i = 0; i < 20; i++) { cnt_row[i] += new_c_row[i] - pre_c_row[i]; sum_row[i] += new_s_row[i] - pre_s_row[i]; } } vector v(20); v[0] = 1; v = M.pow(K) * v; mint ans = 0; for (int i = 0; i < 10; i++) { ans += v[10 + i]; } cout << ans.val() << endl; }