One day Mr. Takahashi picked up a dictionary containing all of the N! permutations of integers 1 through N. The dictionary has N! pages, and page i (1 ≤ i ≤ N!) contains the i-th permutation in the lexicographical order.

Mr. Takahashi wanted to look up a certain permutation of length N in this dictionary, but he forgot some part of it.

His memory of the permutation is described by a sequence P_1, P_2, ..., P_N. If P_i = 0, it means that he forgot the i-th element of the permutation; otherwise, it means that he remembered the i-th element of the permutation and it is P_i.

He decided to look up all the possible permutations in the dictionary. Compute the sum of the page numbers of the pages he has to check, modulo 10^9 + 7.

Constraints

* 1 ≤ N ≤ 500000
* 0 ≤ P_i ≤ N
* P_i ≠ P_j if i ≠ j (1 ≤ i, j ≤ N), P_i ≠ 0 and P_j ≠ 0.

Input

The input is given from Standard Input in the following format:


N
P_1 P_2 ... P_N


Output

Print the sum of the page numbers of the pages he has to check, as modulo 10^9 + 7.

Examples

Input

4
0 2 3 0


Output

23


Input

3
0 0 0


Output

21


Input

5
1 2 3 5 4


Output

2


Input

1
0


Output

1


Input

10
0 3 0 0 1 0 4 0 0 0


Output

953330050
#include <bits/stdc++.h>
using namespace std;
#define sz(x) ((int) (x).size())
#define forn(i,n) for (int i = 0; i < int(n); ++i)
typedef long long ll;
typedef long long i64;
typedef long double ld;
const int inf = int(1e9) + int(1e5);
const ll infl = ll(2e18) + ll(1e10);

const int mod = 1e9 + 7;
const int rev2 = (mod + 1) / 2;

const int maxn = 500500;
vector<int> zeros;
int p[maxn];
bool used[maxn];
ll fact[maxn];

struct Fw {
    int t[maxn];

    void put(int pos, int delta) {
        for (int i = pos; i < maxn; i |= i + 1) {
            t[i] += delta;
            t[i] %= mod;
        }
    }

    ll get(int r) {
        ll res = 0;
        for (int i = r - 1; i >= 0; i = (i & (i + 1)) - 1) {
            res += t[i];
            res %= mod;
        }
        return res;
    }

} fw;

int main() {
    #ifdef LOCAL
    assert(freopen("e.in", "r", stdin));
    #else
    #endif
    int n;
    cin >> n;
    int k = 0;
    forn (i, n) {
        cin >> p[i];
        --p[i];
        if (p[i] == -1)
            ++k;
        else
            used[p[i]] = true;
    }
    forn (i, n)
        if (!used[i])
            zeros.push_back(i);
    ll coef = 0;

    fact[0] = 1;
    for (int i = 1; i < maxn; ++i) {
        fact[i] = (fact[i - 1] * ll(i)) % mod;
    }

    ll res = fact[k];
    ll zc = 0;
    for (int pos = n - 1; pos >= 0; --pos) {
        ll X = fact[n - pos - 1];
        if (p[pos] == -1) {
            ll A = coef;
            A %= mod;
            A *= fact[k - 1];
            A %= mod;
            ll B = zc * fact[k];
            B %= mod;
            B *= rev2;
            B %= mod;

            //cerr << (A + B) * X << '\n';

            res += (A + B) * X;
            res %= mod;

            ++zc;
        } else {
            int bd = lower_bound(zeros.begin(), zeros.end(), p[pos]) - zeros.begin();
            coef += k - bd;
            coef %= mod;

            ll A = fw.get(p[pos]) * fact[k];
            A %= mod;
            ll B = zc * bd;
            B %= mod;
            B *= fact[k - 1];
            B %= mod;

            //cerr << (A + B) * X << '\n';

            res += (A + B) * X;
            res %= mod;

            fw.put(p[pos], 1);
        }
    }
    cout << res << '\n';
}
