抄一下以前的总结。
BSGS
P3846 【模板】BSGS / [TJOI2007] 可爱的质数。
ax≡b(modp)
让你求出最小的 x。
设 m=p,x=im−k。
aim−k≡b(modp)
因为 a 和 p 互质(逆元),不然会无解或者逆元不存在。
aim≡akb(modp)
先计算右边 akb mod p 的值,放入 map。
再计算左边 aim mod p 的值。
存在,答案为 i∗m−h[t]。
否则无解。
不过我们由欧拉定理得:aφ(p)≡1(modp),所以上线就是 φ(p)−1。虽然没必要。
扩展 BSGS
P4195 【模板】扩展 BSGS / exBSGS。
ax=b(modp)=da×ax−1=db(moddp)
重复执行,直到 gcd(a,p)=1。
tot 为 da。
tot×ax−cnt=b(modp)=ax−cnt=b×tot−1(modp)
注意,要用扩展欧几里得算法算出 a 需要的乘一个 tot 的逆元。
然后问题就转换成 BSGS 了。
还有要特判 b 不被 d 整除无解,因为 a 和 p 都可整除,b 不行就不成立。
必须枚举 [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)。
这道题我们可以发现左边这个数是 10(10(10(10+1)+1)+1)+1,于是可以暴力表示出这个式子,然后 BSGS。
但是显然复杂了,我们直接将左右 ×9+1,于是:
10x≡9k+1(modm)
BSGS 就行了。