抄一下以前的总结。

BSGS

P3846 【模板】BSGS / [TJOI2007] 可爱的质数。

ax≡b(modp)a^x\equiv b\pmod p

让你求出最小的 xx。

设 m=p,x=im−km=\sqrt{p},x=im-k。

aim−k≡b(modp)a^{im-k}\equiv b\pmod p

因为 aa 和 pp 互质(逆元),不然会无解或者逆元不存在。

aim≡akb(modp)a^{im}\equiv {a^kb}\pmod p

先计算右边 akb mod p{a^kb}\ mod\ p 的值,放入 map。

再计算左边 aim mod pa^{im}\ mod\ p 的值。

存在,答案为 i∗m−h[t]i* m-h[t]。

否则无解。

不过我们由欧拉定理得:aφ(p)≡1(modp)a^{\varphi (p) }\equiv 1 \pmod p,所以上线就是 φ(p)−1\varphi(p)-1。虽然没必要。

扩展 BSGS

P4195 【模板】扩展 BSGS / exBSGS。

ax=b(modp)=ad×ax−1=bd(modpd)a^x=b\pmod p\\= \dfrac{a}{d}\times a^{x-1}=\dfrac{b}{d}\pmod {\dfrac{p}{d}}

重复执行,直到 gcd⁡(a,p)=1\gcd(a,p)=1。

tottot 为 ad\dfrac{a}{d}。

tot×ax−cnt=b(modp)=ax−cnt=b×tot−1(modp)tot\times a^{x-cnt}=b\pmod p\\= a^{x-cnt}=b\times tot^{-1}\pmod p

注意,要用扩展欧几里得算法算出 aa 需要的乘一个 tottot 的逆元。

然后问题就转换成 BSGS 了。

还有要特判 bb 不被 dd 整除无解,因为 aa 和 pp 都可整除,bb 不行就不成立。

必须枚举 [0,cnt−1][0,cnt-1] 的解。

还要特判:

C++
if(b==1||c==1)return 0;
if(!a)return b?-1:1;

注意输入别输反了,我两道都搞反了然后调了半天。

P4884 多少个 1?

P4884 多少个 1?。

求最小的 111⋯1111≡K(modm)111\cdots 1111 \equiv K\pmod m。

这道题我们可以发现左边这个数是 10(10(10(10+1)+1)+1)+110(10(10(10+1)+1)+1)+1,于是可以暴力表示出这个式子,然后 BSGS。

但是显然复杂了,我们直接将左右 ×9+1\times 9 +1,于是:

10x≡9k+1(modm)10^x\equiv 9k+1 \pmod m

BSGS 就行了。