题目名称 2717. Counting swaps
输入输出 Count_swap.in/out
难度等级 ★★★
时间限制 1000 ms (1 s)
内存限制 64 MiB
测试数据 2
题目来源 GravatarLGLJ 于2019-09-24加入
开放分组 全部用户
提交状态
分类标签
数学 组合数学
分享题解
通过:2, 提交:3, 通过率:66.67%
GravatarLGLJ 100 0.365 s 2.16 MiB C++
Gravatarop_组撒头屯 100 0.509 s 2.26 MiB C++
Gravatarop_组撒头屯 50 1.000 s 2.26 MiB C++
关于 Counting swaps 的近10条评论(全部评论)

2717. Counting swaps

★★★   输入文件:Count_swap.in   输出文件:Count_swap.out   简单对比
时间限制:1 s   内存限制:64 MiB

【题目描述】

给定一个 $1~n$ 的排列 $p1,p2,…,pn$,可进行若干次操作,每次选择两个整数 $x,y$,交换 $px,py$。

设把 $p1,p2,…,pn $变成单调递增的排列$ 1,2,…,n $至少需要$ m $次交换。

求有多少种操作方法可以只用 $m $次交换达到上述目标。

因为结果可能很大,你只需要输出结果对 $10^9+9 $取模之后的值。

例如排列 2,3,1 至少需要2次交换才能变为 1,2,3。操作方法共有3种,分别是:

方法一:先交换数字2,3,变成 3,2,1,再交换数字3,1,变成 1,2,3。

方法二:先交换数字2,1,变成 1,3,2,再交换数字3,2,变成 1,2,3。

方法三:先交换数字3,1,变成 2,1,3,再交换数字2,1,变成 1,2,3。

【输入格式】

第一行包含整数T,表示一共有$T$组测试用例。

每个测试用例前都会有一个空行。

每个测试用例包含两行,第一行包含整数n。

第二行包含n个整数,表示序列$p1,p2,…,pn$。

【输出格式】

每个测试用例输出一个结果,每个结果占一行。

【样例输入】

3

3
2 3 1

4
2 1 4 3

2
1 2

【样例输出】

3
2
1

【提示】

$1≤n≤10^5$

【来源】

【IPSC 2016】