#include #include using namespace std; using mint = atcoder::modint998244353; int mod = 998244353; #define int long long int modPow(int a, int n, int mod) { // aのn乗をmodで割ったあまり if (mod == 1) return 0; int ret = 1; int p = a % mod; while (n) { if (n & 1) ret = ret * p % mod; p = p * p % mod; n >>= 1; } return ret; } void testcase() { int M; string N; cin >> M >> N; reverse(N.begin(), N.end()); vector a(N.size()); // 各項目を数列としておく vector b(N.size()); // 各桁のパターン保持用 mint bpi = 1; // パターンの総積 for (int i = 0; i < N.size(); i++) { // 各桁をintで保持 a[i] = N[i] - '0'; // 各桁の考えうる値の総和を求める b[i] = (M - 1 - a[i]) / 10 + 1; // 等差数列を式変形して出た項数 if (i == N.size() - 1 && a[i] == 0) b[i]--; // 最大の桁が0だった場合に該当する桁を削除 // ついでに該当する桁のパターンも数え上げる bpi *= b[i]; } mint ans = 0; for (int i = 0; i < N.size(); i++) { if (i == N.size() - 1 && a[i] == 0) { ans += modPow(M, i, mod) * bpi * (2 * a[i] + 10 * (b[i] + 1)) / 2; } else { ans += modPow(M, i, mod) * bpi * (2 * a[i] + 10 * (b[i] - 1)) / 2; } } cout << ans.val() << '\n'; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); testcase(); return 0; }