#include #include #include using std::scanf; using std::printf; using ll = long long; const int MOD = 998244353; int solve_odd(std::array cnt) { int n = 0; for (int t : cnt) { n += t; } assert(n % 2 == 1); int nbig = n / 2 + 1; int wbig = 0; for (int i = 0; i < 10; ++i) { while (nbig > 0 && cnt[i] > 0) { wbig = (10LL * wbig + i) % MOD; --nbig; --cnt[i]; } } int wsmall = 0; for (int i = 10; i-- > 0; ) { while (cnt[i] > 0) { wsmall = (10LL * wsmall + i) % MOD; --cnt[i]; } } int ans = (0LL + wbig + (MOD - wsmall)) % MOD; return ans; } int solve_even(std::array cnt) { { bool any_odd = false; for (int v = 0; v < 10; ++v) { if (cnt[v] % 2 != 0) { any_odd = true; break; } } if (!any_odd) return 0; } for (int v = 0; v < 10; ++v) { if (cnt[v] > 3) { cnt[v] = cnt[v] % 2 + 2; } } ll ans = 1LL << 60; auto cnt_orig = cnt; for (int ik = 0; ik < 10; ++ik) { cnt = cnt_orig; for (int i = 0; i < 10; ++i) { if (i == ik) continue; cnt[i] %= 2; } auto cnt_red = cnt; for (int ibig = 1; ibig < 10; ++ibig) { if (cnt_red[ibig] == 0) continue; for (int ismall = 1; ismall < ibig; ++ismall) { if (cnt_red[ismall] == 0) continue; cnt = cnt_red; cnt[ibig] -= 1; cnt[ismall] -= 1; int ncurr = 0; for (int t : cnt) ncurr += t; int nbig = ncurr / 2; ll wbig = ibig; for (int i = 0; i < 10; ++i) { while (nbig > 0 && cnt[i] > 0) { wbig = (10LL * wbig + i); --nbig; --cnt[i]; } } ll wsmall = ismall; for (int i = 10; i-- > 0; ) { while (cnt[i] > 0) { wsmall = (10LL * wsmall + i); --cnt[i]; } } assert(wbig > wsmall); if (wbig - wsmall < ans) { ans = wbig - wsmall; } } } } return static_cast(ans % MOD); } ll readint() { long long n; scanf("%lld", &n); return n; } int main() { int n = readint(); std::array cnt = {}; for (int i = 0; i < n; ++i) { int v = readint(); cnt[v] += 1; } int ans = n % 2 ? solve_odd(cnt) : solve_even(cnt); printf("%d\n", ans); return 0; }