1. 程式人生 > 其它 >P6280 [USACO20OPEN]Exercise G 題解

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