import std; void main () { const long MOD = 998244353; auto N = readln.chomp.map!(a => a - '0').array; struct DPVal { long val; } struct State { int cur; bool less; int mp; Tuple!(bool, State) update (int next) { State nstate; if (!less && N[cur] < next) { return tuple(false, nstate); } nstate.cur = cur + 1; nstate.less = less || next < N[cur]; nstate.mp = mp ^ (1 << next); return tuple(true, nstate); } bool isEnd () { return cur == N.length; } DPVal endValue () { if (mp == 0) { return DPVal(1L); } return DPVal(0L); } } DPVal[State] memo; DPVal f (State state) { if (state in memo) { return memo[state]; } if (state.isEnd()) { return memo[state] = state.endValue(); } DPVal ret; foreach (next; 0 .. 10) { auto nstate = state.update(next); if (!nstate[0]) { continue; } auto nval = f(nstate[1]); ret.val += nval.val; } ret.val %= MOD; return memo[state] = ret; } // i文字目からスタート long ans = 0; foreach (i; 0 .. N.length.to!int) { int up = N[i]; if (0 < i) { up = 9; } foreach (n; 1 .. up + 1) { bool less = (0 < i) || n < up; auto st = State(i + 1, less, 1 << n); ans += f(st).val; } ans %= MOD; } writeln(ans); }