AT_codefestival_2016_qualC_e 順列辞書

Description

[problemUrl]: https://atcoder.jp/contests/code-festival-2016-qualc/tasks/codefestival_2016_qualC_e ある日高橋君は、$ 1 $~$ N $ からなる $ N! $ 個の順列全てが載っている辞書を拾いました。辞書は $ N! $ ページからなり、 $ i\ (1≦i≦N!) $ ページ目には辞書順 $ i $ 番目の順列が載っています。高橋君はこの辞書で長さ $ N $ のある順列を調べようとしましたが、順列の一部の数は忘れてしまいました。そのため、可能性のある順列全てをこの辞書で調べようとしています。高橋くんが調べる必要のあるページ番号の総和を $ 10^9+7 $ で割ったあまりを求めてください。 順列の情報は $ P_1 $,$ P_2 $,$ ... $,$ P_N $ で与えられます。$ P_i=0 $ の時は順列の $ i $ 番目の数を忘れてしまったことを、そうでない場合は順列の $ i $ 番目の数が $ P_i $ であることを意味します。

Input Format

入力は以下の形式で標準入力から与えられる。 > $ N $ $ P_1 $ $ P_2 $ $ ... $ $ P_N $

Output Format

高橋くんが調べる必要のあるページ番号の総和を $ 10^9+7 $ で割ったあまりを出力せよ。

Explanation/Hint

### 制約 - $ 1≦N≦500000 $ - $ 0≦P_i≦N $ - $ i≠j\ (1≦i,j≦N) $ かつ $ P_i≠0 $ かつ $ P_j≠0 $ ならば、 $ P_i≠P_j $ ### 部分点 - $ 1≦N≦3000 $ を満たすデータセットに正解すると、$ 500 $ 点が与えられる。 ### Sample Explanation 1 ありうる順列は$ [1,2,3,4] $と$ [4,2,3,1] $です。前者は$ 1 $ページ目に、後者は$ 22 $ページ目に載っているため、答えは$ 23 $です。 ### Sample Explanation 2 長さ$ 3 $の全ての順列がありうるので、答えは$ 1+2+3+4+5+6\ =\ 21 $ になります。 ### Sample Explanation 3 高橋君は完全に順列を記憶しています。 ### Sample Explanation 4 辞書は$ 1 $ページからなります。