#include <bits/stdc++.h>   long long dx[8] = {0, 1, 0, -1, 1, 1, -1, -1};   long long dy[8] = {1, 0, -1, 0, -1, 1, 1, -1};   using namespace std;   class pa3 {    public:     long long x;     long long y, z;     pa3(long long x = 0, long long y = 0, long long z = 0) : x(x), y(y), z(z) {}     bool operator<(const pa3 &p) const {       if (x != p.x) return x < p.x;       if (y != p.y) return y < p.y;       return z < p.z;     }     bool operator>(const pa3 &p) const {       if (x != p.x) return x > p.x;       if (y != p.y) return y > p.y;       return z > p.z;     }     bool operator==(const pa3 &p) const {       return x == p.x && y == p.y && z == p.z;     }     bool operator!=(const pa3 &p) const {       return !(x == p.x && y == p.y && z == p.z);     }   };   class pa4 {    public:     long long x;     long long y, z, w;     pa4(long long x = 0, long long y = 0, long long z = 0, long long w = 0)         : x(x), y(y), z(z), w(w) {}     bool operator<(const pa4 &p) const {       if (x != p.x) return x < p.x;       if (y != p.y) return y < p.y;       if (z != p.z) return z < p.z;       return w < p.w;     }     bool operator>(const pa4 &p) const {       if (x != p.x) return x > p.x;       if (y != p.y) return y > p.y;       if (z != p.z) return z > p.z;       return w > p.w;     }     bool operator==(const pa4 &p) const {       return x == p.x && y == p.y && z == p.z && w == p.w;     }   };   class pa2 {    public:     long long x, y;     pa2(long long x = 0, long long y = 0) : x(x), y(y) {}     pa2 operator+(pa2 p) { return pa2(x + p.x, y + p.y); }     pa2 operator-(pa2 p) { return pa2(x - p.x, y - p.y); }     bool operator<(const pa2 &p) const { return y != p.y ? y < p.y : x < p.x; }     bool operator>(const pa2 &p) const { return x != p.x ? x < p.x : y < p.y; }     bool operator==(const pa2 &p) const {       return abs(x - p.x) == 0 && abs(y - p.y) == 0;     }     bool operator!=(const pa2 &p) const {       return !(abs(x - p.x) == 0 && abs(y - p.y) == 0);     }   };   string itos(long long i) {     ostringstream s;     s << i;     return s.str();   }   long long gcd(long long v, long long b) {     if (v > b) return gcd(b, v);     if (v == b) return b;     if (b % v == 0) return v;     return gcd(v, b % v);   }   long long mod;   long long extgcd(long long a, long long b, long long &x, long long &y) {     if (b == 0) {       x = 1;       y = 0;       return a;     }     long long d = extgcd(b, a % b, y, x);     y -= a / b * x;     return d;   }   pair<long long, long long> operator+(const pair<long long, long long> &l,                                        const pair<long long, long long> &r) {     return {l.first + r.first, l.second + r.second};   }   pair<long long, long long> operator-(const pair<long long, long long> &l,                                        const pair<long long, long long> &r) {     return {l.first - r.first, l.second - r.second};   }   long long pr[200010];   long long inv[200010];   long long beki(long long wa, long long rr, long long warukazu) {     if (rr == 0) return 1 % warukazu;     if (rr == 1) return wa % warukazu;     wa %= warukazu;     if (rr % 2 == 1)       return ((long long)beki(wa, rr - 1, warukazu) * (long long)wa) % warukazu;     long long zx = beki(wa, rr / 2, warukazu);     return (zx * zx) % warukazu;   }   long long comb(long long nn, long long rr) {     if (rr < 0 || rr > nn || nn < 0) return 0;     long long r = pr[nn] * inv[rr];     r %= mod;     r *= inv[nn - rr];     r %= mod;     return r;   }   void gya(long long ert) {     pr[0] = 1;     for (long long i = 1; i <= ert; i++) {       pr[i] = (pr[i - 1] * i) % mod;     }     inv[ert] = beki(pr[ert], mod - 2, mod);     for (long long i = ert - 1; i >= 0; i--) {       inv[i] = inv[i + 1] * (i + 1) % mod;     }   }   long long ko[11] = {};   vector<long long> p[11][11], q[11][11];   long long ju[40];   long long solve(pair<string, long long> X) {     string s = X.first;     reverse(s.begin(), s.end());     long long l = X.second;     long long ans = 0;     for (long long i = 1; i <= 10; i++) {       long long e = 0;       for (long long j = 0; j < l; j++) {         e += ju[q[i][l][j]] * (s[j] -  0 ) % mod;         e += ju[p[l][i][j]] * (s[j] -  0 ) % mod;         e %= mod;       }       e *= ko[i];       e %= mod;       ans += e;       ans %= mod;     }     return ans;   }   signed main() {     cin.tie(0);     ios::sync_with_stdio(false);     long long n;     cin >> n;     mod = 998244353;     vector<pair<string, long long>> ve;     ju[0] = 1;     for (long long i = 1; i < 40; i++) {       ju[i] = ju[i - 1] * 10 % mod;     }     for (long long l1 = 1; l1 <= 10; l1++)       for (long long r1 = 1; r1 <= 10; r1++) {         long long f = 0;         for (long long i = 0;; i++) {           if (i >= l1 && i >= r1) break;           if (i < l1) {             p[l1][r1].push_back(f);             f++;           }           if (i < r1) {             q[l1][r1].push_back(f);             f++;           }         }       }     for (long long i = 0; i < n; i++) {       long long y;       cin >> y;       string s = itos(y);       ve.push_back(make_pair(s, s.length()));       ko[s.length()]++;     }     long long ans = 0;     for (auto v : ve) {       long long r = solve(v);       ans += r;       ans %= mod;     }     cout << ans << endl;     return 0;   }