UOJ #705. 黃忠慶功宴

275307894a發表於2024-06-27

這玩意咋這麼牛?

首先我們發現,如果 \(k\) 比較小,那麼對於這些 \(k\) 預處理字首和就行了。而一個等差數列又能被劃分成 \(k^{-1}\) 個公差為 \(1\) 的等差數列,因此如果 \(k^{-1}\bmod p\) 比較小,直接暴力就行。

現在考慮一般的情況,如果 \(k=\frac{x}{y}\) 滿足 \(x,y\) 都比較小,則我們可以在 \(O(nx)\) 的時間內預處理,\(O(y)\) 的時間回答單次詢問。

顯然 \(x\times y\) 至少是要 \(O(n)\) 級別的,一個想法是根號平衡,可以證明,只要 \(-\sqrt n\leq x\leq \sqrt n,1\leq y\leq \sqrt n\) 即可表示所有的 \(k\)

考慮對於每個 \(k\),將 \(x,y\in [1,\sqrt n]\) \(x-yk\) 作鴿巢原理,如果一對 \((x_1,y_1),(x_2,y_2)\) 滿足 \(x_1-y_1k=x_2-y_2k\),則 \(k=\frac{x_1-x_2}{y_1-y_2}\),顯然可以將 \(y\) 調整成正的。只需要上界平方略大於 \(n\) 就一定能找到。

時間複雜度 \(O((n+q)\sqrt n)\),應該是可以調整成 \(O(n\sqrt q)\) 的。注意儘量不要在根號上帶上取模運算,否則容易 T。

submission