#include using namespace std; static const long long MOD = 998244353; // 状態遷移関数 // k = (8が含まれるか, 未満か) // v = 現在の個数 // ix = (桁index, 上限digit) vector, long long>> f(pair k, long long v, pair ix) { bool b = k.first; bool lt = k.second; int digit = ix.second; vector, long long>> res; for (int d = 0; d <= 9; ++d) { bool nb = b || (d == 8); if (lt) { res.push_back({{nb, lt}, v}); } else if (d <= digit) { bool nlt = d < digit; res.push_back({{nb, nlt}, v}); } } return res; } // 加算用 op long long op(long long a, long long b) { return (a + b) % MOD; } // accum_dp 相当 map, long long> accum_dp( const vector>& xs, map, long long> init ) { map, long long> dp = init; for (auto ix : xs) { map, long long> next_dp; for (auto& [key, val] : dp) { for (auto& [to_key, to_val] : f(key, val, ix)) { next_dp[to_key] = op(next_dp[to_key], to_val); } } dp.swap(next_dp); } return dp; } int main() { string N; cin >> N; vector digits; for (char c : N) digits.push_back(c - '0'); // 初期化(先頭桁) map, long long> init; for (int d = 0; d <= 9; ++d) { if (d <= digits[0]) { bool b = (d == 8); bool lt = d < digits[0]; init[{b, lt}]++; } } // 残りの桁 vector> xs; for (int i = 1; i < (int)digits.size(); ++i) { xs.emplace_back(i, digits[i]); } auto dp = accum_dp(xs, init); long long res = 0; for (auto& [key, val] : dp) { if (key.first) { res = (res + val) % MOD; } } cout << res << '\n'; return 0; }