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