把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

UOJ #705. 黄忠庆功宴

这玩意咋这么牛?

首先我们发现,如果 \(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

posted @ 2024-06-27 11:55  275307894a  阅读(38)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end