#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ll long long #define MOD 998244353 #define ld long double #define INF 2251799813685248 #define vall(A) A.begin(),A.end() #define gridinput(vv,H,W) for (ll i = 0; i < H; i++){string T; cin >> T; for(ll j = 0; j < W; j++){vv[i][j] = {T[j]};}} #define adjustedgridinput(vv,H,W) for (ll i = 1; i <= H; i++){string T; cin >> T; for(ll j = 1; j <= W; j++){vv[i][j] = {T[j-1]};}} #define vin(A) for (ll i = 0, sz = A.size(); i < sz; i++){cin >> A[i];} #define vout(A) for(ll i = 0, sz = A.size(); i < sz; i++){cout << A[i] << " \n"[i == sz-1];} #define adjustedvin(A) for (ll i = 1, sz = A.size(); i < sz; i++){cin >> A[i];} #define adjustedvout(A) for(ll i = 1, sz = A.size(); i < sz; i++){cout << A[i] << " \n"[i == sz-1];} #define vout2d(A,H,W) for (ll i = 0; i < H; i++){for (ll j = 0; j < W; j++){cout << A[i][j] << " \n"[j==W-1];}} #define encode(i,j) ((i)<<32)+j #define decode(v,w) (w ? (v)%4294967296 : (v)>>32) vector pow2ll{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296}; vector pow10ll{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000,10000000000000,100000000000000,1000000000000000,10000000000000000,100000000000000000,1000000000000000000}; vector di{0,1,0,-1}; vector dj{1,0,-1,0}; /// @brief a^bをmで割った余りを返す。bに関して対数時間で計算できる。 /// @param a /// @param b /// @param m /// @return a^b%m ll modpow(ll a, ll b, ll m){ ll t = a%m; ll ans = 1; while (b > 0){ if (b%2){ ans = (ans*t)%m; } b /= 2; t = (t*t)%m; } return ans; } /// @brief a^nを返す。bに関して線形時間で計算できる。 /// @param a /// @param n /// @param m /// @return a^n ll powll(ll a, ll n){ ll r = 1; for (ll i = 1; i <= n; i++){ r *= a; } return r; } void dfs(vector> &T, vector &temp, ll pos, ll d, ll target){ if (d == target){ T.push_back(temp); return; } for (ll i = pos; i <= target+d; i++){ temp[i] = true; dfs(T,temp,i+1,d+1,target); temp[i] = false; } } int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); ll N; cin >> N; vector A(10,0); set d; for (ll i = 0; i < N; i++){ ll t; cin >> t; d.insert(t); A[t]++; } if (N%2){ ll ans = 0; vector X(N/2+1); vector Y(N/2+1); X.back() = *d.begin(); A[*d.begin()]--; deque Q; for (ll i = 9; i >= 1; i--){ for (ll j = 0; j < A[i]; j++){ Q.push_back(i); } } for (ll i = N/2-1; i >= 0; i--){ Y[i] = Q.front(); Q.pop_front(); } for (ll i = N/2-1; i >= 0; i--){ X[i] = Q.back(); Q.pop_back(); } for (ll i = N/2; i >= 0; i--){ ans += (X[i] - Y[i])*modpow(10,i,MOD); ans %= MOD; } ans += MOD; ans %= MOD; cout << ans << endl; return 0; } ll min_ans = __LONG_LONG_MAX__; vector digitlist; for (ll i = 1; i <= 9; i++){ if (A[i]%2){ digitlist.push_back(i); A[i]--; } } if (digitlist.empty()){min_ans = 0;} vector> T; vector temp(digitlist.size(),0); dfs(T,temp,0,0,digitlist.size()/2); vector Xlist; vector Ylist; for (auto vec : T){ Xlist.clear(); Ylist.clear(); for (ll i = 0; i < digitlist.size(); i++){ if (vec[i]){ Xlist.push_back(digitlist[i]); } else{ Ylist.push_back(digitlist[i]); } } do{ do{ ll tempX = 0; ll tempY = 0; ll t = 1; for (auto v : Xlist){ tempX += t*v; t *= 10; } t = 1; for (auto v : Ylist){ tempY += t*v; t *= 10; } min_ans = min(min_ans, abs(tempX-tempY)); }while(next_permutation(vall(Xlist))); }while(next_permutation(vall(Ylist))); } temp = vector(digitlist.size()+2); T.clear(); dfs(T,temp,0,0,digitlist.size()/2 + 1); for (ll i = 1; i <= 9; i++){ if (A[i] < 2){continue;} auto newdigitlist = digitlist; newdigitlist.push_back(i); newdigitlist.push_back(i); sort(vall(newdigitlist)); for (auto vec : T){ Xlist.clear(); Ylist.clear(); for (ll l = 0; l < newdigitlist.size(); l++){ if (vec[l]){ Xlist.push_back(newdigitlist[l]); } else{ Ylist.push_back(newdigitlist[l]); } } do{ do{ ll tempX = 0; ll tempY = 0; ll t = 1; for (auto v : Xlist){ tempX += t*v; t *= 10; } t = 1; for (auto v : Ylist){ tempY += t*v; t *= 10; } min_ans = min(min_ans, abs(tempX-tempY)); }while(next_permutation(vall(Xlist))); }while(next_permutation(vall(Ylist))); } } cout << min_ans%998244353 << endl; }