题目背景
Charles 是一位密码学家,他正在研究生成随机数的新方法。他试图通过组合多个随机数源来创建一个密码学安全的伪随机数生成器(CSPRNG)。
题目描述
他发明了一种算法,包括以下步骤:
- 随机生成一个长度为 N 的正整数序列 S,其中元素两两不同。
 
- 随机打乱 S,得到一个长度为 N 的排列 P。
 
- 计算排列 P 的字典序排名。
 
- 输出排名对 109+7 取模的结果。
 
排列 P 的字典序排名定义为所有小于等于 P 的排列数量。
Charles 是一位密码学家,但不是程序员。现在,给定排列 P,请帮助 Charles 计算其字典序排名,并对 109+7 取模。
输入格式
第一行包含一个整数 N,表示排列的长度。
第二行包含 N 个正整数 P1,P2,…,PN,表示排列 P。
输出格式
输出一个整数,表示排列 P 的字典序排名,对 109+7 取模。
3
42 100 1
4
5
1 5 2 4 3
20
2
2 1
2
提示
【样例解释】
对于样例 #1,以下是所有排列的字典序:
- [1,42,100]
 
- [1,100,42]
 
- [42,1,100]
 
- [42,100,1]
 
- [100,1,42]
 
- [100,42,1]
 
排列 [42,100,1] 的字典序排名为 4。
【数据范围】
- 1≤N≤3×105
 
- 1≤Pi≤109
 
- 对于任意 i=j,Pi=Pj
 
| 子任务编号 | 
分值 | 
限制条件 | 
| 1 | 
5 | 
N=2 | 
| 2 | 
9 | 
1≤N≤8 | 
| 3 | 
10 | 
P 为严格递增或递减 | 
| 4 | 
11 | 
P=[k,1,…,k−1,k+1,…,N],1≤k≤N | 
| 5 | 
21 | 
1≤N≤3×103,1≤Pi≤N | 
| 6 | 
13 | 
1≤N≤3×103 | 
| 7 | 
19 | 
1≤Pi≤N | 
| 8 | 
12 | 
无其他特殊限制 |