#include using namespace std; using ll = long long; #define CONST_MOD 998244353LL // #define CONST_MOD 1000000007L struct ModInt { long long Value; public: ModInt() { Value = 0L; } ModInt(long long value) { Value = value; } ModInt Power(long long exp) const { if (exp <= -1L) { return ModInt(1L) / Power(-exp); } if (exp == 0L) return 1L; if (exp == 1L) return *this; ModInt m = Power(exp / 2L); m = m * m; if (exp % 2L == 1L) { m = m * (*this); } return m; } ModInt Inv() const { return this->Power(CONST_MOD - 2L); } ModInt operator+() const { return *this; } ModInt operator-() const { return ModInt(-Value); } friend ModInt operator+(const ModInt& left, const ModInt& right) { return ModInt(SafeMod(left.Value + right.Value)); } friend ModInt operator+(const ModInt& left, const long long& right) { return ModInt(SafeMod(left.Value + right)); } friend ModInt operator+(const long long& left, const ModInt& right) { return ModInt(SafeMod(left + right.Value)); } ModInt& operator+=(const ModInt& x) { Value += x.Value; Value = SafeMod(Value); return *this; } ModInt& operator+=(const long long& x) { Value += x; Value = SafeMod(Value); return *this; } friend ModInt operator-(const ModInt& left, const ModInt& right) { return ModInt(SafeMod(left.Value - right.Value)); } friend ModInt operator-(const ModInt& left, const long long& right) { return ModInt(SafeMod(left.Value - right)); } friend ModInt operator-(const long long& left, const ModInt& right) { return ModInt(SafeMod(left - right.Value)); } ModInt& operator-=(const ModInt& x) { Value -= x.Value; Value = SafeMod(Value); return *this; } ModInt& operator-=(const long long& x) { Value -= x; Value = SafeMod(Value); return *this; } friend ModInt operator*(const ModInt& left, const ModInt& right) { return ModInt(SafeMod(left.Value * right.Value)); } friend ModInt operator*(const ModInt& left, const long long& right) { return ModInt(SafeMod(left.Value * right)); } friend ModInt operator*(const long long& left, const ModInt& right) { return ModInt(SafeMod(left * right.Value)); } ModInt& operator*=(const ModInt& x) { Value *= x.Value; Value = SafeMod(Value); return *this; } ModInt& operator*=(const long long& x) { Value *= x; Value = SafeMod(Value); return *this; } friend ModInt operator /(const ModInt& left, const ModInt& right) { ModInt inv = right.Inv(); return ModInt(SafeMod(left.Value * inv.Value)); } friend ModInt operator/(const ModInt& left, const long long& right) { return ModInt(SafeMod(left.Value * ModInt(right).Inv().Value)); } friend ModInt operator/(const long long& left, const ModInt& right) { return ModInt(SafeMod(left * right.Inv().Value)); } ModInt& operator/=(const ModInt& x) { Value *= x.Inv().Value; Value = SafeMod(Value); return *this; } ModInt& operator/=(const long long& x) { Value *= ModInt(x).Inv().Value; Value = SafeMod(Value); return *this; } ModInt& operator++() { ++Value; Value = SafeMod(Value); return *this; } ModInt operator++(int) { ModInt temp = *this; Value++; Value = SafeMod(Value); return temp; } ModInt& operator--() { --Value; Value = SafeMod(Value); return *this; } ModInt operator--(int) { ModInt temp = *this; Value--; Value = SafeMod(Value); return temp; } inline static ModInt One() { return ModInt(1L); } static ModInt Combination(long long n, long long r) { ModInt c = 1L; for (ModInt i = 1; i.Value <= r; i++) { c = c * (ModInt(n) - i + ModInt::One()) / i; } return c; } private: inline static long long SafeMod(long long a) { a %= CONST_MOD; if (a < 0) { a += CONST_MOD; } return a; } }; class ModCache { private: vector _factorial; vector _inverseFactorial; vector _inverse; public: ModCache(int max) { _factorial.resize(max + 1); _inverseFactorial.resize(max + 1); _inverse.resize(max + 1); _factorial[0] = 1; _inverseFactorial[0] = 1LL; _inverse[1] = 1LL; for (long p = 1; p <= max; p++) { _factorial[p] = _factorial[p - 1] * p; if (p > 1) { _inverse[p] = -(CONST_MOD / p) * _inverse[CONST_MOD % p]; } _inverseFactorial[p] = _inverseFactorial[p - 1] * _inverse[p]; } } ModInt Combination(int n, int r) { if (n < 0 || r < 0 || n < r) return 0; return _factorial[n] * (_inverseFactorial[n - r] * _inverseFactorial[r]); } ModInt Permutation(int n, int r) { return _factorial[n] * _inverseFactorial[n - r]; } ModInt Factorial(int n) { return _factorial[n]; } ModInt InverseFactorial(int n) { return _inverseFactorial[n]; } ModInt Inverse(int n) { return _inverse[n]; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } vector invA(N); for (int i = 0; i < N; i++) { invA[i] = ((ModInt)A[i]).Inv(); } sort(A.begin(), A.end()); ModInt ans = 0LL; for (int i = 0; i < N; i++) { ans += (A[i] + 1) / (ModInt)2LL; } for (int m = 1; m <= A[0]; m++) { ModInt left = 1LL; ModInt right = 1LL; for (int i = 1; i < N; i++) { right *= (ModInt)(A[i] - m) * invA[i]; } for (int k = 0; k < N; k++) { ans += (A[k] - m) * left * right * invA[k]; left *= (A[k] - m + 1) * invA[k]; if (k < N - 1) { right /= (ModInt)(A[k + 1] - m) * invA[k + 1]; } } } cout << ans.Value << endl; }