在线 $\Theta(1)$ 逆元
最近看到这个题,想到了一种比较简单的做法。
首先,我们考虑给 \(x\) 乘以一非零整数 \(u\),如果我们能求出 \(\frac{1}{xu}\),我们就可以通过再乘以 \(u\) 得到答案。
考虑让 \(u\) 和 \(xu \bmod p\) 比较接近 \(0\),预处理 \(|k|\) 比较小的所有 \(\frac{1}{k}\)。
考虑分块:设 \(x = aB+c(0 \le c<B)\),对于 \(aB\) 找到一个满足条件的 \(u\)。考虑令 \(B = p^{1/3}\),\(u\) 不超过 \(\Theta(p^{1/3})\),且 \(|aBu|\) 不超过 \(\Theta(p^{2/3})\)。
这样,\(xu = (aBu + cu) \bmod p\) 的绝对值就是 \(\Theta(p^{2/3})\) 级别的了。
怎么预处理 \(aB\) 中的 \(u\) 呢?我们的问题可以看成是找到一组 \((u,v)\) 使得 \(\frac{v}{u} \equiv aB (\bmod p)\),使得 \(|v| \le p^{2/3}\),\(u \le p^{1/3}\)。而根据 黄忠庆功宴 中的结论,这是一定可以找到的!
(证明大概就是对要 check 的 \(x=aB\) 做抽屉原理,\(\{ax+b\} (a \le p^{1/3},b \le p^{2/3})\) 中如果存在相同的一对数那我们就找到了合法解)
但是怎么样找到这样的 \((u,v)\) 呢?我们枚举 \(u\),找到所有的 \(k\) 使得 \(|ukB| \le p^{2/3}\)。由于 \(uB\) 不是很大,所以我们每次跳找下一个合法 \(k\) 即可。
稍加卡常的 aclink。