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 <cstdlib>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cstring>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;

#define SIZE(x) (int((x).size()))
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define repd(i,r,l) for (int i=(r); i>=(l); i--)
#define rept(i,c) for (typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)

#ifndef ONLINE_JUDGE
#define debug(x) { cerr<<#x<<" = "<<(x)<<endl; }
#else
#define debug(x) {}
#endif

#define MD 1000000007
#define INV2 500000004

#define maxn 500010

int fact[maxn], a[maxn], v[maxn], t[maxn], ta[maxn];

void serere(int x, int y)
{
	while (x<maxn) ta[x]+=y, x+=x&-x;
}

int query(int x)
{
	int ret=0;
	while (x) ret+=ta[x], x-=x&-x;
	return ret;
}

void lemon()
{
	int n; scanf("%d",&n);
	fact[0]=1; rep(i,1,n) fact[i]=LL(fact[i-1])*i%MD;
	rep(i,1,n) scanf("%d",&a[i]);
	
	rep(i,1,n) v[i]=1;
	rep(i,1,n) if (a[i]) v[a[i]]=0; 
	repd(i,n,1) v[i]=v[i+1]+v[i];
	
	int m=0;
	rep(i,1,n) if (!a[i]) m++;
	
	repd(i,n,1)
		if (!a[i])
			t[i]=t[i+1];
		else
			t[i]=(t[i+1]+v[a[i]])%MD;
		
	int ans=fact[m];
	int cnt=0;
	repd(i,n,1)
		if (!a[i])
		{
			ans+=LL(LL(LL(fact[n-i])*fact[m]%MD)*INV2%MD)*cnt%MD;
			ans%=MD;
			cnt++;
		}
	
	rep(i,1,n)
		if (!a[i])
		{
			ans+=LL(LL(t[i])*fact[n-i]%MD)*fact[m-1]%MD;
			ans%=MD;
		}
		
	rep(i,1,n) v[i]=1;
	rep(i,1,n) if (a[i]) v[a[i]]=0; 
	rep(i,1,n) v[i]=v[i-1]+v[i];
	
	cnt=0;
	repd(i,n,1)
		if (!a[i])
			cnt++;
		else
		{
			ans+=LL(LL(LL(fact[n-i])*v[a[i]]%MD)*cnt%MD)*fact[m-1]%MD;
			ans%=MD;
		}
		
	repd(i,n,1)
	{
		if (!a[i]) continue;
		int x=query(a[i]);
		ans+=LL(LL(fact[n-i])*x%MD)*fact[m]%MD;
		ans%=MD;
		serere(a[i],1);
	}
	cout<<ans<<endl;
	
	
}

int main()
{
	ios::sync_with_stdio(true);
	#ifndef ONLINE_JUDGE
		//freopen("E.in","r",stdin);
	#endif
	lemon();
	return 0;
}

