QOJ.ac

QOJ

時間限制: 3 s 記憶體限制: 128 MB 總分: 100

#534. 勤奋的约翰尼

统计

小约翰过生日了……但这可是一个严肃的算法问题,所以这个可怜的孩子没收到任何玩具、游戏或电脑作为生日礼物。相反,他收到了一些填满数字的长数组、树、地图,以及写满长达 $1048576$ 个字符的斐波那契数列和图厄-莫尔斯序列(Thue-Morse words)前缀的磁带等等。在所有这些益智礼物中,他最喜欢的是一个包含前 $n$ 个正整数的排列*的数组。很快,小约翰开始好奇他所得到的排列的字典序前驱排列†是什么。在很快算出答案后,小约翰立刻问自己,如何在数组中写出这个前驱排列。数组唯一支持的操作是交换任意两个单元格的内容。幸运的是,小约翰足够聪明,能以最少的交换次数将初始排列转换为其前驱排列。他发现这个任务非常引人入胜,于是他不断地将每一个后续的排列转换为它的前驱排列。

在沉迷于排列的过程中,小约翰忽略了他所有的生日派对客人,客人们觉得这很有趣,但也有些失礼。其中一位客人很快意识到,当小约翰得到字典序最小的恒等排列 $1, 2, \dots, n$ 时,他就会停止。问题是,这需要多长时间?请帮助他们回答这个问题,已知每次交换都需要小约翰正好一秒钟。由于这可能需要一段时间(“勤奋”是小约翰的中间名),客人们只要知道总时间对 $10^9 + 7$ 取模的结果就心满意足了。毕竟,他们每隔 $10^9 + 7$ 秒就可以检查一下小约翰是否终于完成了。

输入格式

标准输入的第一行包含一个正整数 $n$,表示小约翰得到的排列的长度。第二行给出了该排列,为一个包含 $n$ 个互不相同的整数 $p_1, p_2, \dots, p_n$ ($1 \le p_i \le n$) 的序列,由空格分隔。

输出格式

你的程序应向标准输出打印小约翰在停止前所进行的交换次数对 $10^9 + 7$ 取模的结果。

样例

样例输入 1

3
3 1 2

样例输出 1

6

说明

小约翰所经历的字典序递减的排列序列为 $(2, 3, 1), (2, 1, 3), (1, 3, 2), (1, 2, 3)$。为了得到这些排列,他总共进行了 $2 + 1 + 2 + 1 = 6$ 次交换。

子任务

测试集由以下子任务组成。每个子任务内可能包含多个测试组。

子任务 属性 分值
1 $n \le 10$ 15
2 $n \le 5000$ 37
3 $n \le 1\,000\,000$,排列为 $n, n-1, \dots, 1$ 15
4 $n \le 1\,000\,000$ 33

  • $1$ 到 $n$ 的数字的排列是一个由互不相同的整数 $p_1, \dots, p_n$ 组成的序列,满足 $1 \le p_i \le n$(即 $1$ 到 $n$ 的每个整数在排列中恰好出现一次)。 † 排列 $P = (p_1, \dots, p_n)$ 的字典序小于排列 $Q = (q_1, \dots, q_n)$(记作 $P < Q$),如果存在索引 $j$ 使得 $p_j < q_j$,且对于所有小于 $j$ 的索引 $k$ 都有 $p_k = q_k$。如果 $P < Q$ 且不存在排列 $R$ 使得 $P < R < Q$,则称排列 $P$ 是 $Q$ 的字典序前驱。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.