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<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
int d[505050];
int occ[505050];
#define SIZE 524288
class BIT
{
public:
	int bit[SIZE + 1];
	void add(int a, int b)
	{
		a++;
		for (;;)
		{
			bit[a] += b;
			a += a&-a;
			if (a > SIZE)return;
		}
	}
	int get(int a)
	{
		a++;
		int ret = 0;
		for (;;)
		{
			ret += bit[a];
			a -= a&-a;
			if (a == 0)return ret;
		}
	}
};
BIT bi;
ll po(ll a, ll b)
{
	if (b == 0)return 1;
	ll z = po(a, b / 2);
	z = z*z%mod;
	if (b & 1)z = z*a%mod;
	return z;
}
ll inv(ll a)
{
	return po(a, mod - 2);
}
int main()
{
	int num;
	scanf("%d", &num);
	for (int i = 0; i < num; i++)scanf("%d", &d[i]), occ[d[i]] = 1;
	vector<int>v;
	for (int i = 1; i <= num; i++)if (occ[i] == 0)v.push_back(i);
	ll kai = 1;
	for (int i = 1; i < v.size(); i++)kai = kai*i%mod;
	ll k2 = 1;
	for (int i = 1; i <= v.size(); i++)k2 = k2*i%mod;
	ll tim = 1;
	ll sum = 0;
	ll ans = 0;
	ll dd = 0;
	for (int i = num - 1; i >= 0; i--)
	{
		if (d[i] == 0)
		{
			ans += (sum + v.size()*dd%mod*inv(2) % mod)*tim%mod*kai;
			ans %= mod;
			dd++;
		}
		else
		{
			int low = lower_bound(v.begin(), v.end(), d[i]) - v.begin();
			ll ko = (bi.get(d[i]) + dd*low%mod*inv(v.size())) % mod;
			ans += ko*tim%mod*k2;
			ans %= mod;
			sum += v.size() - low;
			sum %= mod;
			bi.add(d[i], 1);
		}
		tim *= num - i;
		tim %= mod;
	}
	printf("%lld\n", (ans + k2) % mod);
}