[AHOI2022] 排列
Statement
对于一个长度为 \(n\) 的排列 \(P = (p_1, p_2, \ldots, p_n)\) 和整数 \(k \ge 0\),定义 \(P\) 的 \(k\) 次幂
该排列的第 \(i\) 项为
容易证明任意排列的任意次幂都是一个排列。
定义排列 \(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)\) 取模的结果。
对于 \(100 \%\) 的测试数据,\(1 \le T \le 5\),\(1 \le n \le 5 \times {10}^5\),\(1 \le a_i \le n\)。
Solution
做这种题肯定要考虑简化操作的。
连边 \(i\rightarrow p_i\),这个就是群论的置换。那么 \(P^k\) 的具体含义就是每个 \(i\) 走 \(k\) 步。这样做之后整个图就是若干不相交的环。显然循环节就是所有置换长度的 \(\mathrm{lcm}\)。
考虑 \(f(i,j)=0\) 的充要条件,显然就是 \(i,j\) 在同一个置换。将 \(p_i,p_j\) 调换后,会影响 \(i,j\) 所在的两个环的连通性。具体地,\(i\rightarrow p_i\) 会变成 \(i\rightarrow p_j\),\(j\) 类似。再看眼,这不就是把两个环合并吗。因为 \(p_i,p_j\) 后面连的就不一样。再看眼,这仅与两个环原来的大小有关。
设形成了 \(m\) 个置换,第 \(i\) 个置换的大小为 \(s_i\),那么题目意思就是计算以下柿子的值:
然而你被骗了。环的长度种类是 \(\sqrt n\) 级别的。对于这个性质,考虑反证,如果是大于 \(\sqrt n\) 级别的,总和会 \(>n\)。
这个玩意,再搞下就是支持删除两个数,插入一个数并查询 \(\mathrm{lcm}\)。只要暴力不写的太难看就行。
posted on 2023-10-13 19:03 nullptr_qwq 阅读(64) 评论(0) 收藏 举报
浙公网安备 33010602011771号