func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 5000 + 10;   const int MOD = 998244353;   long long f[maxn];   int lim[maxn];   long long frac[maxn], ifrac[maxn];   int arr[maxn], b[maxn];   int n;   long long fpow(long long a, long long b) {     long long ret = 1;     while (b) {       if (b & 1) ret = (ret * a) % MOD;       a = (a * a) % MOD;       b >>= 1;     }     return ret;   }   void init() {     frac[0] = 1;     for (int i = 1; i < maxn; i++) frac[i] = frac[i - 1] * i % MOD;     ifrac[maxn - 1] = fpow(frac[maxn - 1], MOD - 2);     for (int i = maxn - 2; i >= 0; i--) ifrac[i] = ifrac[i + 1] * (i + 1) % MOD;     return;   }   long long A(int a, int b) {     if (a < b || b < 0) return 0;     return frac[a] * ifrac[a - b] % MOD;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(nullptr);     cout.tie(nullptr);     init();     cin >> n;     for (int i = 1; i <= n; i++) {       cin >> arr[i];       b[i] = arr[i] * 2;     }     sort(arr + 1, arr + 1 + n);     sort(b + 1, b + 1 + n);     for (int i = 1; i <= n; i++) {       int dex = upper_bound(b + 1, b + 1 + n, arr[i]) - b;       --dex;       lim[i] = dex;     }     f[0] = 1;     lim[0] = -1;     for (int i = 1; i <= n; i++) {       for (int j = 0; j <= lim[i]; j++)         f[i] = (f[i] + f[j] * A(n - 2 - lim[j], lim[i] - lim[j] - 1) % MOD) % MOD;     }     if (lim[n] == n - 1)       cout << f[n] <<   n ;     else       cout << 0 <<   n ;     return 0;   }   