演算法模版 同餘最短路

2022-05-25 22:21:11 字數 902 閱讀 8618

當我們解決形如\(\sum_^n a_ix_i=k\)的時候,我們可以使用同餘最短路來解決。

我們選擇乙個最小的\(a_i\)作為base,然後把其他的\(a\)表示成\(base*p+left\)的形式。

我們定義\(f[i]\)代表湊出\(\bmod base\)餘\(i\)的數最小需要多少個\(base\)。

而乙個數\(p\)能被湊出當且僅當\(f[p\bmod base]\leq \frac \)

for(int i=0;i我們把\(\mod base\)的剩餘系考慮成乙個環,那麼\(f[i]\)代表在換上轉幾次圈才能走到\(i\)這個點。每次走的步數可以在序列\(a\)中任意選擇乙個。

我們會發現,要讓所有\(f[i]\)最小,那我們每次走都應該是從乙個走過的點走到乙個沒有走到過的點。如果走了一段時間,發現不管從環上哪個點走,走多少步,都無法到達乙個沒到達過的點。這種情況下,沒到達過的點就永遠不能到達了。

所以走的次數的上界就是最大的\(a\)。

因為如果把最大的\(a\)取為\(base\)(雖然這樣複雜度不是最優的,但是我們可以這樣來計算上界)。那麼每走一圈都最少會新到達乙個點。所以要取遍剩餘系就最多需要走\(a_\)次。

顯然,這樣可以保證點數最小(剩餘系最小)。

上一種方法雖然可以針對元素大小超過\(10^\)的情況,但是很容易會寫炸。

於是我用了另一種方法:\(f[i]\)記錄湊出\(\bmod base\)餘\(i\)最小的數是多少。

這樣雖然要求元素小於\(10^9\),但是好實現多了。

同餘最短路小記

前幾天 mns 的時候遇到被卡科技了,然後墊底了 雖說是個極其簡單的東西,但是出於學乙個演算法必須要寫學習筆記的強迫症,還是寫幾行字吧。考慮問題 給定正整數 a 有哪些非負整數能被 a 由非負整數權線性表出。n 2 exgcd?完全揹包?我們發現若 x 可以,則 x ka 1 k in n 也可以。...

HDU 6071(同餘最短路)

給你四個點,相鄰兩個點之間有一條連邊。現在問你從 2 號點走到 2 號點的至少為 k 的最短路的長度。因為題目中的 k 比較大,因此一些亂搞的演算法顯然無法通過,而鑑於點數相對來說比較少,因此我們得研究一下這幾個點所蘊涵的性質。我們發現,對於 2 號結點,它有兩條可行的邊,我們設這兩條邊的距離分別為...

兩題切入 同餘最短路

同餘最短路問題在acm比賽裡面考察的較少,屬於冷門的知識點,當我們遇到類似 給定n個整數,求這n個整數能組成多少種不同的數 等等問題的時候,可以考慮這種方法。以p3403作為乙個簡單的示例 有乙個高為h的大樓,每次可以向上移動x y z層,問可以到達的樓層數.簡單的說,這道題就是讓求x x1 y x...