Loading

[USACO20OPEN] Exercise G

算法

题意简述

给定长为 \(n\) 的排列 \(A\)

每次改变顺序, 位置 \(i\) 的奶牛移动到 \(A_i\)

重复以上步骤, 直到每只奶牛回到原来的位置


容易发现, 对于正确的排列 \(A\) , 每只奶牛总会回到原来的位置

观察到和之前的某一道题很相似?

考虑回到原来位置的本质,

显然的, 对于排列建图会产生一些环, 当 \(k = \rm{lcm}(C_1, C_2, C_3, \cdots ,C_n)\) 时, 就是最少的步数

例如对于题面中的变换

\[A = \{2, 3, 1, 5, 4\} \]

建图可得

pA2r24I.png

观察发现 \(n = 2, C_1 = 3, C_2 = 2\) , 则 \(k = \rm{lcm}(2, 3) = 6\)

一般的, 这是一个典型类型的题目

简化题意

问题转化为将整数 \(n\) 拆成 \(n = \sum len_i\)

\[\rm{lcm}\{ len_i \} \]

全部可能取值和

注意这里转化很巧妙, 因为是全排列, 所以拆出来的任意一种都可以被构造, 也就是都应该计算答案

求解

pA2rWCt.png

有了这个 \(\rm{trick}\) , 解决变得简单

\(f_{i, j}\) 表示枚举到前 \(i\) 个环, 之前的环长都可以表示为 \(len_i = {p_i} ^ {c_i}\) , 其中 \(\displaystyle\sum_{j = 1}^{i} len_i = j\)

有 (枚举 \(s\))

\[f_{i, j} = \sum_{ {p_i} ^ s \leq j} f_{i - 1, j - {p_i} ^ {s} } \times {p_i} ^ {s} \]

初始化令 \(f_{0, 0} = 1\) , 答案为 \(\displaystyle \sum_{i = 0}^{n} f_{\lvert{p}\rvert, i}\)

滚动一下即可转移

时间复杂度较为玄学, 不知道

代码

总结

对于这一类题, 善于将其与环 / 环长联系起来, 就可以转化成本题中 \(\rm{lcm}\) 的形式

\(\rm{lcm} \ \gcd\) 一类问题的处理, 要往唯一分解定理的方向去考虑, 对于大部分题目, 拆成质数不会影响

posted @ 2024-11-16 09:45  Yorg  阅读(13)  评论(0)    收藏  举报