P6280 [USACO20OPEN]Exercise G 题解

一道 DP 题,好像有人叫这类题为数论 DP?但是不就是一个质数吗。

首先我们观察到如果这堆奶牛想要回到原位,那么对应的 a i a_i ai 一定会构成一个环。换言之,如果连边 i → a i i \to a_i iai,那么就会出现若干个环。

而如果需要恰好 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=ppqj,q1(fi1,jpq×pq)

这个的大意就是说因为这里选了 p q p^q pq 的数,前面方案的和是 f i − 1 , j − p q f_{i-1,j-p^q} fi1,jpq,这些和在加入 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值