func_code_string: #include <bits/stdc++.h>   using namespace std;   long long mod = 1000000007;   long long mod2 = 998244353;   long long mod3 = 1000003;   long long mod4 = 998244853;   long long mod5 = 1000000009;   long long inf = 1LL << 60;   double pi = 3.141592653589793238462643383279L;   double eps = 1e-9;   int dh[4] = {1, -1, 0, 0};   int dw[4] = {0, 0, 1, -1};   int ddh[8] = {-1, -1, -1, 0, 0, 1, 1, 1};   int ddw[8] = {-1, 0, 1, -1, 1, -1, 0, 1};   long long gcd(long long a, long long b) {     if (a < b) swap(a, b);     if (b == 0) return a;     if (a % b == 0) return b;     return gcd(b, a % b);   }   long long Pow(long long n, long long k) {     long long ret = 1;     long long now = n;     while (k > 0) {       if (k & 1) ret *= now;       now *= now;       k /= 2;     }     return ret;   }   long long beki(long long n, long long k, long long md) {     long long ret = 1;     long long now = n;     while (k > 0) {       if (k % 2 == 1) {         ret *= now;         ret %= md;       }       now *= now;       now %= md;       k /= 2;     }     return ret;   }   long long gyaku(long long n, long long md) { return beki(n, md - 2, md); }   long long popcount(long long n) {     long long ret = 0;     long long u = n;     while (u > 0) {       ret += u % 2;       u /= 2;     }     return ret;   }   struct BIT {    private:     long long u;     vector<long long> bit;       public:     BIT(long long n) {       u = 1;       while (u < n) u *= 2;       bit.resize(u + 10, 0);     }     void add(long long n, long long x) {       long long i = n;       bit[i] += x;       bit[i] %= mod;       while (i < u) {         i += i & (-i);         bit[i] += x;         bit[i] %= mod;       }     }     long long sum(long long n) {       long long i = n;       long long ret = 0;       while (i > 0) {         ret += bit[i];         i -= i & (-i);         ret %= mod;       }       return ret;     }   };   long long gya[1000010];   long long kai[1000010];   void nckinit(long long n, long long md) {     kai[0] = 1;     kai[1] = 1;     for (int i = 2; i <= n; i++) {       kai[i] = kai[i - 1] * i;       kai[i] %= md;     }     gya[n] = gyaku(kai[n], md);     for (int i = n - 1; i >= 1; i--) {       gya[i] = gya[i + 1] * (i + 1);       gya[i] %= md;     }     gya[0] = 1;   }   long long nck(long long n, long long k, long long md) {     if (k < 0) return 0;     if (k == 0 || n == k) return 1;     long long ret = kai[n];     ret *= gya[n - k];     ret %= md;     ret *= gya[k];     ret %= md;     return ret;   }   long long npk(long long n, long long k, long long md) {     if (k < 0) return 0;     if (k == 0) return 1;     long long ret = kai[n];     ret *= gya[n - k];     ret %= md;     return ret;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     long long n;     cin >> n;     long long p[n];     long long l = 0;     bool used[n + 1];     fill(used, used + n + 1, false);     long long pla[n + 1];     for (long long i = 0; i < n; i++) {       cin >> p[i];       if (p[i] == -1)         l++;       else {         used[p[i]] = true;         pla[p[i]] = i + 1;       }     }     long long dp[l + 1];     dp[0] = 0;     dp[1] = 0;     nckinit(n + 1, mod2);     for (long long i = 2; i < l + 1; i++) {       dp[i] = i * (i - 1) / 2;       dp[i] %= mod2;       (dp[i] *= kai[i - 1]) %= mod2;       (dp[i] += dp[i - 1] * i) %= mod2;     }     long long su[n + 1];     su[n] = 0;     for (long long i = n - 1; i >= 0; i--) {       su[i] = su[i + 1];       if (p[i] == -1) su[i]++;     }     long long cnt = 0;     BIT bit(n + 1);     long long ans = dp[l];     for (long long i = n; i >= 1; i--) {       if (used[i]) {         long long r = bit.sum(pla[i]);         (ans += r * kai[l]) %= mod2;         bit.add(pla[i], 1);         cnt += su[pla[i] - 1];         cnt %= mod2;       } else {         (ans += cnt * kai[l - 1]) %= mod2;       }     }     long long su2[n + 1];     su2[0] = 0;     for (long long i = 0; i < n; i++) {       su2[i + 1] = su2[i];       if (p[i] == -1) su2[i + 1]++;     }     cnt = 0;     for (long long i = 1; i < n + 1; i++) {       if (used[i]) {         cnt += su2[pla[i]];         cnt %= mod2;       } else {         (ans += cnt * kai[l - 1]) %= mod2;       }     }     ans *= gya[l];     cout << ans % mod2 << endl;   }   