Loading

不可根号 BSGS 时的若干解决办法

许多题如果用 \(O(\sqrt p)\)\(\texttt{BSGS}\) 会超时,下面是我见过的若干解决办法。

前置知识:原根,离散对数,阶,BSGS。下文设 \(p\) 为素数,原根为 \(g\)\(\text{ord}_r(a)\) 表示 \(a\)\(r\) 的阶。

科技

重新平衡复杂度

可以 \(O(B+\frac{np}{B})\) 求出 \(n\) 个数的离散对数,只是把原来的根号重新平衡了一下。具体来说:预处理 \(g^0,g^1,\dots,g^{B-1}\),记录到哈希表上。查询时判断 \(x\times g^{kB}\) 在哈希表上的值即可。应用:P9994

注:P9994不建议这种繁杂写法,有一种类似基排的分三段做法也能根号不带 \(\log\),更好写。详见 dead_X 题解

单次 \(\log\) 但预处理较慢

可以 \(O(\frac{p^{3/4}}{\log p})\) 预处理,\(O(\log p)\) 查询一个数的离散对数。这里 Ctrl+F:BSGS 即可

应用:\(\forall 1\le i\le n\),求 \(i^i\)\(10^9+7\) 取模,\(1\le n\le 2\times 10^7\)。好像被出到某次 zr 模拟赛。更优秀的方法

简单粗暴地做法:取原根,转化为求 \(1\sim n\) 的离散对数,最后光速幂一下即可。

由于 \(\log(ab)=\log a+\log b\),于是只要求素数处的离散对数,套用上述方法即可。复杂度 \(O(\dfrac{n\log p}{\ln n}+\dfrac{p^{3/4}}{\log p})\),可以看做线性。

useless 的困难科技

loj 6542. 离散对数,参考这篇博客

skip 离散对数

大致类型是形如判断是否存在 \(t\) 满足 \(x^t\equiv y\pmod m\),其中 \(m\) 存在原根,\((x,m)=(y,m)=1\)

假设 \(T\) 组多测。此时直接 BSGS 做是 \(O(T\sqrt m)\) 的。

考虑用阶代替,设 \(a=\text{ord}_m(x),b=\text{ord}_m(y)\),易证存在 \(t\) 的充要条件是 \(b\mid a\)。(不会证请翻看应用题目的题解)

单次求阶可以枚举 \(\varphi(m)\) 的素因子依次试除即可。

复杂度 \(O(\sqrt[4]{m}+T\log^2 m)\),依赖 pollard-rho 素因数分解。

而转成整除也可以快速解决关于此的一些计数问题(应用 \(1\))。

应用:ABC335GP5605

posted @ 2024-02-24 18:33  HaHeHyt  阅读(139)  评论(0编辑  收藏  举报