Problem:
Score : 1200 points

Problem Statement

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.

Partial Score

In test cases worth 500 points, 1 ≤ N ≤ 3000.

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.

Sample Input 1

4
0 2 3 0

Sample Output 1

23

The possible permutations are [1, 2, 3, 4] and [4, 2, 3, 1].
Since the former is on page 1 and the latter is on page 22, the answer is 23.

Sample Input 2

3
0 0 0

Sample Output 2

21

Since all permutations of length 3 are possible, the answer is 1 + 2 + 3 + 4 + 5 + 6 = 21.

Sample Input 3

5
1 2 3 5 4

Sample Output 3

2

Mr. Takahashi remembered all the elements of the permutation.

Sample Input 4

1
0

Sample Output 4

1

The dictionary consists of one page.

Sample Input 5

10
0 3 0 0 1 0 4 0 0 0

Sample Output 5

953330050

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=1000000007,MAX=500005,INF=1<<30;
int cnt[MAX],X[MAX],Xsum[MAX],cntsmall[MAX],cntbig[MAX];

struct BIT{
    vector<int> bit;
    int N;
    //1-indexed
    
    void init(int n_){
        N=n_;
        n_*=2;
        for(int i=30;i>=0;i--){
            if(n_&(1<<i)){
                n_=1<<i;
                n_++;
                break;
            }
        }
        bit.assign(n_,0);
    }
    
    int sum(int i){
        int s=0;
        while(i>0){
            s+=bit[i];
            i-=i&-i;
        }
        return s;
    }
    
    //sからtの和=sum(t)-sum(s-1)
    
    void add(int i,int x){
        while(i<=N){
            bit[i]+=x;
            i+=i&-i;
        }
    }
};

ll rui(ll a,ll b){
    ll ans=1;
    while(b>0){
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans;
}

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    int N;cin>>N;
    vector<int> P(N);
    for(int i=0;i<N;i++) cin>>P[i];
    
    ll ans=0;
    for(int i=N-1;i>=0;i--){
        cnt[i]=cnt[i+1];
        if(P[i]==0){
            cnt[i]++;
        }else{
            X[P[i]]=1;
        }
    }
    
    for(int i=1;i<=N;i++){
        Xsum[i]=Xsum[i-1]+X[i];
        cntsmall[i]=i-Xsum[i];
        cntbig[i]=cnt[0]-cntsmall[i];
    }
    
    BIT bi;
    
    bi.init(N);
    
    ll fac=1,sum=0;
    
    for(int i=N-1;i>=0;i--,fac*=max(1,N-1-i),fac%=mod){
        ll plus=0;
        if(P[i]==0){
            plus+=rui(2,mod-2)*cnt[i+1];
            plus%=mod;
            
            plus+=sum*rui(cnt[0],mod-2)%mod;
            plus%=mod;
        }else{
            plus+=cntsmall[P[i]]*rui(cnt[0],mod-2)%mod*cnt[i+1]%mod;
            plus%=mod;
            
            plus+=bi.sum(P[i]);
            ans%=mod;
            
            bi.add(P[i],1);
            sum+=cntbig[P[i]];
            sum%=mod;
        }
        
        ans+=fac*plus%mod;
        ans%=mod;
        
        //cout<<ans<<endl;
    }
    
    ll p=1;
    
    for(int i=1;i<=cnt[0];i++){
        ans*=i;
        p*=i;
        ans%=mod;
        p%=mod;
    }
    ans+=p;
    ans%=mod;
    
    cout<<ans<<endl;
}