题库练习 「AHOI2022」排列
← 上一题 下一题 →

A6593 | 「AHOI2022」排列

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

题目描述

对于一个长度为 $n$ 的排列 $P = (p_1, p_2, \ldots, p_n)$ 和整数 $k \ge 0$,定义 $P$ 的 $k$ 次幂

$$P^{(k)} = \left( p^{(k)}_1, p^{(k)}_2, \ldots, p^{(k)}_n \right),$$

该排列的第 $i$ 项为

$$p^{(k)}_i = \begin{cases} i, & k = 0, \\ p^{(k - 1)}_{p_i}, & k > 0. \end{cases}$$

容易证明任意排列的任意次幂都是一个排列。

定义排列 $P$ 的**循环值** $v(P)$ 为最小的**正整数** $k$ 使得 $P^{(k + 1)} = P$。

给出一个长度为 $n$ 的排列 $A = (a_1, a_2, \ldots, a_n)$,对于整数 $1 \le i, j \le n$,定义 $f(i, j)$:若存在 $k \ge 0$ 使得 $a^{(k)}_i = j$,则 $f(i, j) = 0$,否则设排列 $A_{i j}$ 为将排列 $A$ 的第 $i$ 项 $a_i$ 和第 $j$ 项 $a_j$ 交换后得到的排列,则 $f(i, j) = v(A_{i j})$。

求 $\sum_{i = 1}^{n} \sum_{j = 1}^{n} f(i, j)$ 的值。答案可能很大,你只需要输出其对 $({10}^9 + 7)$ 取模的结果。

输入格式

**本题有多组测试数据**。输入数据的第一行为一个整数 $T$,表示测试数据组数。

对于每组测试数据,第一行一个正整数 $n$ 表示排列的长度,接下来一行 $n$ 个整数 $a_1, a_2, \ldots, a_n$,描述输入的排列。

输出格式

对于每组数据输出一行一个整数,表示题目所求的答案对 $({10}^9 + 7)$ 取模的结果。

输入输出样例

输入 #1
2
3
1 2 3
3
2 3 1
输出 #1
12
0
C++ 编辑器
输入
输出