置换
比赛主页
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
我们定义一个长度为
的置换为
到其本身的一个双射(即一种对应关系
,把
到
的每个数和另一个
到
的数(可以为其本身)一一对应起来)。
例如
为长度为
的一个置换,意义为
。其循环节为
。循环节
的含义为在置换中
。可以发现一个置换可以唯一地拆分成各个循环节。
另一方面,每一个置换
都可以唯一地对应一个排列
,使得
。在这种条件下,可以比较两个置换的字典序——只要比较其对应排列的字典序即可。我们称置换
比
字典序大当且仅当
对应的排列
字典序比
对应的排列
字典序大。
现在给出长度为
的置换
,求所有长度为
且字典序严格大于
的置换
的循环节个数之和。
输入描述:
第一行数字
接下来一行
个互不相同的数字表示该置换
输出描述:
一行一个数表示答案模
的结果
示例1
输入
复制
3 2 3 1
3 2 3 1
输出
复制
3
3
说明
大于该置换的置换有两个
可拆分为
可拆分为
总计三个循环节
示例2
输入
复制
6 2 1 6 5 3 4
6 2 1 6 5 3 4
输出
复制
1299
1299
备注:
置换
返回全部题目
列表加载中...
3 2 3 1
3
6 2 1 6 5 3 4
1299