BSGS算法用于解决已知 a,b,P的情况下,(a、P互质)
求最小的非负整数x满足
ax≡b(mod P)
a
x
≡
b
(
m
o
d
P
)
具体操作百度一大把,这里简略说一下,就是令m=
P−−√
P
设x=i*m+j,枚举i然后左右同乘
yi∗m
y
i
∗
m
的逆元,转化为求
aj≡z′(mod P)
a
j
≡
z
′
(
m
o
d
P
)
是否有解,又
j<m
j
<
m
,直接预处理即可。
扩展BSGS是改成y、P不互质,
设d为gcd(a,P)>1,则显然d|b,否则无解;
然后b,p同除d,左式乘上
ad
a
d
的逆元,然后问题转化为
ax−1≡b′(mod P′
a
x
−
1
≡
b
′
(
m
o
d
P
′
其中
b′=bd∗(ad)−1,P′=Pd)
b
′
=
b
d
∗
(
a
d
)
−
1
,
P
′
=
P
d
)
这显然是一个子问题,递归做即可。
核心代码如下:
if (d>1)
{
if (b%d) return -100000;
b/=d;p/=d;
b=(LL)b*getny(a/d,p)%p;
return bsgs(a,b,p)+1;
}
例题:
bsgs bzoj2242
exbsgs bzoj3283(这题第三问是组合数取模,需要用到快速阶乘,详见这里)