P6280 [USACO20OPEN]Exercise G 题解
一道 DP 题,好像有人叫这类题为数论 DP?但是不就是一个质数吗。
首先我们观察到如果这堆奶牛想要回到原位,那么对应的 \(a_i\) 一定会构成一个环。换言之,如果连边 \(i \to a_i\),那么就会出现若干个环。
而如果需要恰好 \(k\) 步回到原位,那么就需要所有环长的最小公倍数是 \(k\)。
显然最小公倍数肯定只与质数最高次幂有关系,于是我们可以考虑线筛 \([1,n]\) 的质数然后 DP 。
设 \(f_{i,j}\) 表示选了前 \(i\) 个质数和为 \(j\) 时候的答案,那么有转移方程:
\[f_{i,j}=\sum_{p \leq p^q \leq j, q \geq 1}(f_{i-1,j-p^q} \times p^q)
\]
这个的大意就是说因为这里选了 \(p^q\) 的数,前面方案的和是 \(f_{i-1,j-p^q}\),这些和在加入 \(p^q\) 之后总贡献是相乘的。
初值是 \(f_{0}=1\),因为 \(k=1\) 也是可以的,只不过直接我们不会统计 \(k=1\) 的答案,所以要初值。
- 其实 \(k=1\) 的可行性题目中不是说的很清楚,\(k=1\) 是因为 \(a_i=i\) 时奶牛们动了一步,但是又全部呆在原地,
动了但完全没动,此时也是算一种方案的。
Code:GitHub CodeBase-of-Plozia P6280 [USACO20OPEN]Exercise G