置换
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

我们定义一个长度为的置换为到其本身的一个双射(即一种对应关系,把的每个数和另一个的数(可以为其本身)一一对应起来)。
例如为长度为的一个置换,意义为。其循环节为。循环节的含义为在置换中。可以发现一个置换可以唯一地拆分成各个循环节。
另一方面,每一个置换都可以唯一地对应一个排列,使得。在这种条件下,可以比较两个置换的字典序——只要比较其对应排列的字典序即可。我们称置换字典序大当且仅当对应的排列字典序比对应的排列字典序大。
现在给出长度为的置换,求所有长度为且字典序严格大于的置换的循环节个数之和。

输入描述:

第一行数字
接下来一行个互不相同的数字表示该置换

输出描述:

一行一个数表示答案模的结果
示例1

输入

复制
3
2 3 1

输出

复制
3

说明

大于该置换的置换有两个
{[3,1,2]}可拆分为{(3,2,1)}
{[3,2,1]}可拆分为{(3,1)(2)}
总计三个循环节
示例2

输入

复制
6
2 1 6 5 3 4

输出

复制
1299

备注: