func_code_string: #include <bits/stdc++.h>   const long long mod = 998244353;   const int kN = 5e3 + 10;   int n, a[kN], lim[kN];   long long f[kN], fac[kN], invfac[kN];   inline int read() {     int f = 1, w = 0;     char ch = getchar();     for (; !isdigit(ch); ch = getchar())       if (ch ==  - ) f = -1;     for (; isdigit(ch); ch = getchar()) {       w = (w << 3) + (w << 1) + (ch ^  0 );     }     return f * w;   }   void Chkmax(int &fir_, int sec_) {     if (sec_ > fir_) fir_ = sec_;   }   void Chkmin(int &fir_, int sec_) {     if (sec_ < fir_) fir_ = sec_;   }   long long QPow(long long x_, long long y_) {     x_ %= mod;     long long ret = 1;     for (; y_; y_ >>= 1ll) {       if (y_ & 1) ret = ret * x_ % mod;       x_ = x_ * x_ % mod;     }     return ret;   }   long long A(long long n_, long long m_) {     if (n_ < 0 || m_ < 0 || m_ > n_) return 0;     return 1ll * fac[n_] * invfac[n_ - m_] % mod;   }   void Prepare() {     n = read();     invfac[0] = fac[0] = 1;     for (int i = 1; i <= n; ++i) {       a[i] = read();       fac[i] = 1ll * fac[i - 1] * i % mod;       invfac[i] = QPow(fac[i], mod - 2);     }     std::sort(a + 1, a + n + 1);     for (int i = 1, j = 0; i <= n; ++i) {       while (j <= n && 2ll * a[j] <= 1ll * a[i]) ++j;       --j;       lim[i] = j;     }   }   int main() {     Prepare();     if (lim[n] != n - 1) {       printf( 0 n );       return 0;     }     f[0] = 1, lim[0] = -1;     for (int i = 1; i <= n; ++i) {       for (int j = 0; j <= lim[i]; ++j) {         f[i] += 1ll * f[j] *                 A(1ll * n - 2ll - lim[j], 1ll * lim[i] - lim[j] - 1ll) % mod;         f[i] %= mod;       }     }     printf( %lld n , f[n]);     return 0;   }   