#include #include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; template struct matrix { int n,m; vector> A; matrix(vector> _A): A(_A){ n = A.size(); if(n){ m = A[0].size(); for(int i=1;i& operator[](int row){return A[row];} const vector& operator[](int row) const { return A[row]; } matrix operator+(const matrix& B) const { assert(n == B.n && m == B.m); matrix C(n, m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { C[i][j] = A[i][j] + B[i][j]; } } return C; } matrix& operator+=(const matrix& B) { assert(n == B.n && m == B.m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { A[i][j] += B[i][j]; } } return *this; } matrix operator-(const matrix& B) const { assert(n == B.n && m == B.m); matrix C(n, m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { C[i][j] = A[i][j] - B[i][j]; } } return C; } matrix& operator-=(const matrix& B) { assert(n == B.n && m == B.m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { A[i][j] -= B[i][j]; } } return *this; } matrix operator*(const matrix& B) const { assert(m == B.n); // 列数と行数が一致すること matrix C(n, B.m); for (int i = 0;i>> gaussian(){ matrix B = A; bool isSwap = false; // 今r行c列まで見た // O(min(r,c)*r*c) vector pivots; for(int r = 0,c = 0;r m ? Tr() : A; auto [B,_] = _A.gaussian(); // Traceを取っている可能性があることに注意 int ret = min(n,m); for(int i=0;i> basis; vector is_pivot(m, false); for (int p : pivots) is_pivot[p] = true; for (int c = 0; c < m; ++c) { if (!is_pivot[c]) { // pivotではない列について1をたてて、掃き出し後の行列で0でない行については、 // pivot (掃き出し後で1になっている) で調整するイメージ vector vec(m, 0); vec[c] = 1; for (int i = 0; i < pivots.size(); ++i) { vec[pivots[i]] = -B[i][c]; } basis.push_back(vec); } } return matrix(basis); } }; #include #include #include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; typedef long long ll; int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); string s; cin >> s; ll k; cin >> k; int i,j,l,n = s.size(); // 先頭10個 := 末尾がiの総和 // 後半10個 := 末尾がiの個数 // 20変数の線形和をもって計算する const int SZ = 20; array,20> v; for(i=0;i ar_v,ar_c; for(i=0;i A(SZ,SZ); for(i=0;i B = A.pw(k); matrix C(SZ,1); // 先頭0の文字だけ持ってるという解釈 C[10][0] = 1; matrix D = B*C; mint ans = 0; for(i=0;i<10;i++) ans += D[i][0]; cout << ans.val() << "\n"; // for(i=10;i