同餘最短路
P3403 跳樓機
題意:給出正整數 \(x, y, z \le 10^5\) 和值域限制 \(h\),求 \(1 \sim h\) 中形如 \(ax + by + cz\) 的數的個數,其中 \(a, b, c\) 非負。
我們把最後答案根據模 \(c\) 分類:
那麼對於每一個同餘類 \(i\),問題轉化為找 \(p = by + cz \equiv i \bmod c\) 的最小 \(p\)。
假設已經累加到了 \(v\),此時可以花費 \(y\) 到達 \((v + y) \bmod x\)。
所求的 \(p\) 就是起點到 \(i\) 的最短路。點數和邊數都是 \(O(n)\),邊權為正,dijstra 跑最短路。
submission
[ABC077D] Small Multiple
題意:給定正整數 \(n\),求 \(n\) 的倍數中最小的數位和。
任意數可以被如下過程生成:
- \(+ 1\),同時數位和加一。
- \(\times 10\),數位和不變。
因此對模意義下的 \(n\) 個點連出兩條邊,\(+1\) 邊權為 \(1\),\(\times 10\) 邊權為 \(0\),01BFS 線性求最短路。
不會出現加一操作連續出現 10 次的情況,因為直接乘 10 代價更小。
submission
P2662 牛場圍欄
題意:給定 \(n\) 種長度的木棍(無限根),求出這些木棍不能拼出的最大長度。
取排序後最小的長度 \(a_1\) 為模數。
還是第一題的套路,求出與 \(i\) 同餘的最小的 \(d_i = \sum_{j = 2}^{n} a_jx_j\) ,只不過這題每個點需要連出去 \(n - 1\) 條邊。
時間複雜度 \(O(n^2\log n)\),對於每一種剩餘類來說,其不能到達的最大長度等於 \(d_i - a_1\)。
submission
P2371 [國家集訓隊] 墨墨的等式
題意:給定 \(n, [a_n], l, r\),求有多少 \(x \in [l, r]\) 使得 \(x = \sum a_ix_i\) 存在非負整數解。
還是套路,選最小的 \(a\) 作為模數,跑最短路,對每個剩餘類依次考慮貢獻。
submission
P9140 [THUPC 2023 初賽] 揹包
題意: