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 <cmath>

#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <fstream>
using namespace std;

#define maxn 500010
#define inf 1000000000
#define ll long long
#define mod 1000000007

int n;
long long free_sum, free_total, inv2;
int aib[maxn], gr[maxn], sm[maxn];
long long fac[maxn];
bool fre[maxn];
int p[maxn];

int LSB(int i) {
    return i&-i;
}

int query(int aib[], int i) {
    int s = 0;
    for (; i > 0; i -= LSB(i)) {
        s += aib[i];
    }
    return s;
}

void update(int aib[], int i, int val) {
    for (; i <= n; i += LSB(i)) {
        aib[i] += val;
    }
}

void precalc() {
    fac[0] = 1;
    for (int i = 1; i <= n; ++i) {
        fac[i] = fac[i-1] * i % mod;
    }

    free_total = 0;
    free_sum = 0;
    for (int i = 1; i <= n; ++i) {
        if (fre[i]) {
            ++free_total;
            free_sum = (free_sum + (i-1)) % mod;
        }
        sm[i] = free_total;
    }
    for (int i = 1; i <= n; ++i) {
        gr[i] = free_total - sm[i];
    }
    inv2 = mod/2+1;
}

int main() {
    // freopen("test.in", "r", stdin);
    cin >> n;

    for (int i = 1; i <= n; ++i) {
        fre[i] = true;
    }

    for (int i = 1; i <= n; ++i) {
        cin >> p[i];
        fre[p[i]] = false;
    }

    precalc();

    long long ans = 0;
    long long running_free = 0;
    long long running_sum = 0;
    for (int i = 1; i <= n; ++i) {
        if (!p[i]) {
            ans = (ans + fac[free_total-1] * free_sum % mod * fac[n-i] % mod) % mod;
            long long in_order = (fac[free_total] * inv2 % mod * running_free % mod + running_sum * fac[free_total-1] % mod) % mod;
            ans = (ans - in_order * fac[n-i] % mod) % mod;
            if (ans < 0)
                ans += mod;
            ++running_free;
        } else {
            ans = (ans + fac[free_total] * (p[i]-1) % mod * fac[n-i] % mod) % mod;
            long long in_order = (fac[free_total] * query(aib, p[i]) % mod + (free_total >= 1 ? (running_free * sm[p[i]] % mod * fac[free_total-1] % mod) : 0)) % mod;
            ans = (ans - in_order * fac[n-i] % mod) % mod;
            if (ans < 0)
                ans += mod;
            running_sum = (running_sum + gr[p[i]]) % mod;
            update(aib, p[i], 1);
        }
    }

    ans = (ans + fac[free_total]) % mod;

    cout << ans;
}
