[USACO20OPEN] Exercise G
算法
题意简述
给定长为 \(n\) 的排列 \(A\)
每次改变顺序, 位置 \(i\) 的奶牛移动到 \(A_i\)
重复以上步骤, 直到每只奶牛回到原来的位置
容易发现, 对于正确的排列 \(A\) , 每只奶牛总会回到原来的位置
观察到和之前的某一道题很相似?
考虑回到原来位置的本质,
显然的, 对于排列建图会产生一些环, 当 \(k = \rm{lcm}(C_1, C_2, C_3, \cdots ,C_n)\) 时, 就是最少的步数
例如对于题面中的变换
建图可得
观察发现 \(n = 2, C_1 = 3, C_2 = 2\) , 则 \(k = \rm{lcm}(2, 3) = 6\)
一般的, 这是一个典型类型的题目
简化题意
问题转化为将整数 \(n\) 拆成 \(n = \sum len_i\)
求
全部可能取值和
注意这里转化很巧妙, 因为是全排列, 所以拆出来的任意一种都可以被构造, 也就是都应该计算答案
求解
有了这个 \(\rm{trick}\) , 解决变得简单
令 \(f_{i, j}\) 表示枚举到前 \(i\) 个环, 之前的环长都可以表示为 \(len_i = {p_i} ^ {c_i}\) , 其中 \(\displaystyle\sum_{j = 1}^{i} len_i = j\)
有 (枚举 \(s\))
初始化令 \(f_{0, 0} = 1\) , 答案为 \(\displaystyle \sum_{i = 0}^{n} f_{\lvert{p}\rvert, i}\)
滚动一下即可转移
时间复杂度较为玄学, 不知道
代码
略
总结
对于这一类题, 善于将其与环 / 环长联系起来, 就可以转化成本题中 \(\rm{lcm}\) 的形式
\(\rm{lcm} \ \gcd\) 一类问题的处理, 要往唯一分解定理的方向去考虑, 对于大部分题目, 拆成质数不会影响



浙公网安备 33010602011771号