题库练习 「NOI2018」冒泡排序
← 上一题 下一题 →

A6546 | 「NOI2018」冒泡排序

来源NOI
时间限制1s
内存限制512MB
通过 / 提交0/0

题目描述

最近,小 S 对冒泡排序产生了浓厚的兴趣。为了问题简单,小 S 只研究对 **$1$ 到 $n$ 的排列**的冒泡排序。

下面是对冒泡排序的算法描述。

```plain
输入:一个长度为 n 的排列 p[1...n]
输出:p 排序后的结果。
for i = 1 to n do
for j = 1 to n - 1 do
if(p[j] > p[j + 1])
交换 p[j] 与 p[j + 1] 的值
```

冒泡排序的交换次数被定义为交换过程的执行次数。可以证明交换次数的一个下界是 $\frac 1 2 \sum_{i=1}^n \lvert i - p_i \rvert$,其中 $p_i$ 是排列 $p$ 中第 $i$ 个位置的数字。如果你对证明感兴趣,可以看提示。

小 S 开始专注于研究长度为 $n$ 的排列中,满足交换次数 $= \frac 1 2 \sum_{i=1}^n \lvert i - p_i \rvert$ 的排列(在后文中,为了方便,我们把所有这样的排列叫「好」的排列)。他进一步想,这样的排列到底多不多?它们分布的密不密集?

小 S 想要对于一个给定的长度为 $n$ 的排列 $q$,计算字典序严格大于 $q$ 的“好”的排列个数。但是他不会做,于是求助于你,希望你帮他解决这个问题,考虑到答案可能会很大,因此只需输出答案对 $998244353$ 取模的结果。

输入格式

从文件 inverse.in 读入数据。

输入第一行包含一个正整数 $T$,表示数据组数。

对于每组数据,第一行有一个正整数 $n$,保证 $n \leq 6 \times 10^5$。

接下来一行会输入 $n$ 个正整数,对应于题目描述中的 $q_i$,保证输入的是一个 $1$ 到 $n$ 的排列。

输出格式

输出到文件 inverse.out 中。

输出共 $T$ 行,每行一个整数。

对于每组数据,输出一个整数,表示字典序严格大于 $q$ 的「好」的排列个数对 $998244353$ 取模的结果。

输入输出样例

输入 #1
1
3
1 3 2
输出 #1
3
输入 #2
1
4
1 4 2 3
输出 #2
9
C++ 编辑器
输入
输出